我目前正在编写一个工具来监视使用Proxy对对象所做的更改。 因此,我有一个函数watchObject
,它将一个对象作为参数并将其包装在代理中,其中对应于对象更改的处理程序调用debugger;
。这watchObject
主要基于这个question接受的答案。在Javascript:如何检测变量的引用何时发生变化
设置陷阱让,defineProperty和deleteProperty处理工作得很好,当对象仅修改。
但是,当引用被替换时,处理程序不会被调用,并且绕过它的代理服务器将丢失。
让我们考虑包含对象a
关键foo
:
var a = { foo: "bar"};
例如下面将调用一个调试器断点这是我的陷阱里:
a.foo = "Hello"
delete a.foo
a.baz = "Hi"
等..
但后来调用:a = {keyOne: "one"}
将不会触发断点,并且对上述示例(否则会触发断点)的后续调用将不会再调用断点。
所以我想知道是否有办法检测到如下操作:a = {keyOne: "one"}
是为了监视变量的引用更改并能够在新引用的对象上重新创建代理对象。另外,由于监视对象变化的整个过程旨在简化调试,因此解决方案必须对涉及的代码无损坏。
使用代理是伟大的,因为它只拦截并不改变对象包装的整体行为。
你也许可以,如果你把它包装在一个额外的对象,听上到。 – ankr
您是否尝试过使用您的js引擎的实际调试器API? – Bergi
“非破坏性”是什么意思?即使你的代理解决方案需要改变一些代码来包装一个特定的对象。 – Bergi