我目前正在编写一个工具,用于监控使用Proxy对对象所做的更改。
所以我有一个函数watchObject
,它将一个对象作为参数并将其包装在代理中,其中处理程序对应于对象调用debugger;
中的更改。此watchObject
主要基于此question的接受答案。
仅在修改对象时,在获取, defineProperty 和 deleteProperty 处理程序上设置陷阱效果非常好。
但是,当替换引用时,不会调用处理程序,并且会丢失围绕它的代理程序。
让我们考虑一个包含密钥a
的对象foo
:
var a = { foo: "bar"};
例如,以下内容将调用陷阱中的调试器断点:
a.foo = "Hello"
delete a.foo
a.baz = "Hi"
等...... 但是之后调用它:a = {keyOne: "one"}
将不会触发断点,并且后续调用上面的示例(否则将触发断点)将不再调用断点。
所以我想知道是否有办法检测类似的操作:a = {keyOne: "one"}
已完成,以便监视变量的引用更改,并能够在新引用的对象上重新创建代理对象。
此外,由于监视对象更改的整个过程旨在使调试更容易,因此解决方案必须对所涉及的代码具有非破坏性。
使用代理非常棒,因为它只会拦截并且不会更改包裹对象的整体行为。
答案 0 :(得分:2)
我想试一试......
看起来你想要捕捉对象而不是方法。
由于对象的变量将被设置为窗口或其他对象的属性,我们可以使用函数在窗口(或该对象)上使用所需的变量名定义getter和setter:
0%
请注意,执行此操作后,您无法在窗口上重新定义属性。
我希望这会有所帮助:)