Javascript:如何检测变量的引用何时更改

时间:2017-06-29 12:09:13

标签: javascript proxy javascript-objects

我目前正在编写一个工具,用于监控使用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"}已完成,以便监视变量的引用更改,并能够在新引用的对象上重新创建代理对象。

此外,由于监视对象更改的整个过程旨在使调试更容易,因此解决方案必须对所涉及的代码具有非破坏性。
使用代理非常棒,因为它只会拦截并且不会更改包裹对象的整体行为。

1 个答案:

答案 0 :(得分:2)

我想试一试......

看起来你想要捕捉对象而不是方法。

由于对象的变量将被设置为窗口或其他对象的属性,我们可以使用函数在窗口(或该对象)上使用所需的变量名定义getter和setter:

0%

请注意,执行此操作后,您无法在窗口上重新定义属性。

我希望这会有所帮助:)