窗口上的代理

2024-03-18

我想设立一个Proxy当定义了新属性时它会警告我window目的。 (实际上我想捕获所有全局变量声明)

let handler = {
    defineProperty(target, key, descriptor) {
        console.log('hey', key);
        return false;
    }
};
window = new Proxy(window, handler);
window.foo = 'bar';
// nothing happens

上面的代码适用于除窗口之外的任何对象:

let handler = {
    defineProperty(target, key, descriptor) {
        console.log('hey', key);
        return false;
    }
};
let target = {};
target = new Proxy(target, handler);
target.foo = 'bar';
// console: "hey  bar"

有什么办法可以设置一个Proxy on the window对象,如果不可能,是否有任何棘手的解决方案来实现相同的目标?


简短的回答是否定的。您不能为此使用代理。 最好修改和重构您的应用程序,以避免进行此类恶作剧。但我知道有时我们没有时间把事情做好。尽管我不建议您这样做,但您仍然可以对窗口对象进行更改。

您有多种选择来执行此操作。 如果你知道你正在寻找的变量列表,你可以使用类似的东西Watch.JS https://github.com/melanke/Watch.JS基本上它能够跟踪所有更改,但我无法使其可靠地工作,因此最好指定一个列表

watch(window, ['list', 'of', 'vars'], (prop, action, newVal, oldVal) => {
    console.log('Property changed', prop, action, newVal, oldVal);
}, 1);

作为替代方案,您可以创建一个简单的脏检查器

let props = Object.keys(window);
const check = () => {
    const currentProps = Object.keys(window);
    const newProps = currentProps.filter(item => props.indexOf(item) === -1);
    if (newProps.length) {
        console.log('Added these properties', newProps);
        props = currentProps;
    }
    requestAnimationFrame(check);
};
requestAnimationFrame(check);

But in case you decided to go with either solution, you have to make sure all checks will stop when needed to avoid memory leaks, or CPU consumption. This check code is not consuming too much but it could in theory. So you have to keep an eye on it. On empty page profile data looks like this profile data

并且记得使用unwatch如果是 Watch.JS,或者添加一个条件来停止检查,以防万一您使用第二个解决方案,一旦他们完成工作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

窗口上的代理 的相关文章

随机推荐

  • 控制器的 Angular 中的 Jasmine 测试

    我收到以下错误 TypeError undefined is not a function问题是公共的是模块和工厂 问题出在我的线上 var ctrl controllerConstructor resetPasswordSentScree
  • 有没有办法从 MongoDB 检索没有 _id 字段的数据?

    我在我们的项目中使用 MongoDB 目前正在学习它是如何工作的 当插入记录时 MongoDB自动生成ID 查询数据时 总是返回 id 当我们将 Bson Json 反序列化为 out 对象时 这会产生一个问题 因为我们的类型没有该字段 而
  • 使用 C# 在 asp.net 中排序列表和下拉列表

    我有一个返回排序列表的方法 我想将其数据源到下拉列表 我在用 DropDownList1 DataSource stList DropDownList1 DataValueField stList ContainsValue DropDow
  • Haskell:针对 Hackage 的多个版本的基础测试包

    我正在尝试将我的第一个包上传到 Hackage 耶 但出现以下错误 依赖项 build depends base 未指定版本号的上限 基础 包的每个主要版本都会以各种方式更改 API 并且大多数包都需要进行一些更改才能与其一起编译 推荐的做
  • Flutter更新BottomNavigationBar

    我将 BottomNavigationBar 与 TabController 一起使用 通过单击 BottomNavigationBar 的不同选项卡 TabView 会更改内容 但是 如果我在 TabView 上滑动以切换到另一个视图 选
  • 如何使用 C# xaml 以编程方式设置数据绑定

    如何以编程方式设置 DataContext 并在 C Xaml 中创建数据绑定 给定一个类 class Boat INotifyPropertyChanged public event PropertyChangedEventHandler
  • npm 错误!网络 getaddrinfo ENOTFOUND

    我正进入 状态npm ERR network getaddrinfo ENOTFOUND尝试使用 NPM 安装任何包时出错 我知道有很多关于同一问题的线程 但我找不到任何可以帮助我的线程 我已经设置了代理 我认为这与代理设置不正确 没有使用
  • 将 pandas.DataFrame 添加到现有 Excel 文件

    我有一个网络抓取工具 可以为本月的抓取创建一个 Excel 文件 我想在每次运行时将今天的刮擦和该月的每次刮擦添加到该文件中作为新工作表 然而 我的问题是 它仅用新工作表覆盖现有工作表 而不是将其添加为单独的新工作表 我尝试使用 xlrd
  • Hibernate 延迟加载问题

    我在 Hibernate 5 中映射了这个实体 class A private String code private B child LazyToOne LazyToOneOption PROXY ManyToOne fetch Fetc
  • 在不使用cocoapods的情况下向现有项目添加框架

    我有一个现有项目 我想在其中添加名为 CoreActionSheetPicker 的框架 https github com skywinder ActionSheetPicker 3 0 问题是我似乎无法将框架添加到我的项目中 当我将框架拉
  • 如何在 Java 中生成没有按键代码的键盘事件?

    我使用 Robot 类和 KeyEvent 按键代码来生成所有其他按键事件 它们工作正常 但我还需要 Hangul 键 切换韩语键盘 显然 KeyEvent 没有这个键的键码 所以我被卡住了 有没有办法生成这个韩文键事件 有没有办法使用 W
  • Angular2:使用 DynamicComponentLoader 动态插入组件上的双向数据绑定

    我正在开发 Angular2 应用程序 遇到一个问题 我有一组可以使用 UI 选择的不同对象 每个对象都有一组可以使用 UI 进行编辑的选项 不同对象不同 现在 我使用 DynamicComponentLoader 为当前选定的对象插入特定
  • Git 中可以使用特殊字符吗?

    我真的很高兴我修复了 Rails 代码中的这个愚蠢的错误 并且很高兴地在终端中输入了以下内容 git add git commit am Finally fixed that difficult bug 才发现git不喜欢 有谁知道我可以将
  • Python Pandas Concat“WHERE”满足条件

    如何 连接 许多 Python Pandas 数据帧中的特定列 其中许多数据帧中每个数据帧中的另一列满足特定条件 此处通俗地称为条件 X 在 SQL 中 使用 JOIN 子句和 WHERE df2 Col2 X 和 df3 Col2 X 和
  • 是否对破折号进行编码

    我正在尝试在我的 Phonegap Android 应用程序中使用 Google Analytics 我按照这个仓库中的说明进行操作 https github com DoersGuild Cordova Android Analytics
  • 如何检查两个 Map 对象是否相等?

    我如何检查是否有两个ES2015 地图 https developer mozilla org en US docs Web JavaScript Reference Global Objects Map对象具有相同的集合 key valu
  • 我如何在学说上使用“外键”?

    我正在 symfony2 和原则上制作课程管理系统 我对在学说中使用外键感到困惑 实体 用户 php class User extends BaseUser ORM Id ORM Column type integer ORM Genera
  • 是否可以通过 smtp 通过 bash 脚本发送邮件?

    我有postfix dovecot 我想制作可以使用 SMTP 的 bash 脚本 我不想使用sendmail 是否可以 也许有人有一些代码示例 男孩 当挑战被抛出时 它总是bash就在我的头顶上 bin sh function check
  • 是否需要锁定对 bool 的访问,或者是否过度杀伤力

    我有一个主要设计为 POCO 类的类 具有各种线程和任务可以读取其值 只有其他人偶尔会更新这些值 这似乎是 ReaderWriterLockSlim 的理想场景 问题是 在类中 如果需要线程安全的属性 如果该属性是bool 是不是有点大材小
  • 窗口上的代理

    我想设立一个Proxy当定义了新属性时它会警告我window目的 实际上我想捕获所有全局变量声明 let handler defineProperty target key descriptor console log hey key re