这个问题很简单,但对于 Object.observe 的当前实现来说,这似乎是不可能的。想象 :
var obj = { foo: 1 }
Object.observe(obj, function (changes) {
console.log(changes)
})
obj.foo = 2
正如预期的那样,这将记录一个包含我所做更改的对象。所以问题是如何在没有这种副作用的情况下更改属性?
这个问题很简单,但对于 Object.observe 的当前实现来说,这似乎是不可能的。想象 :
var obj = { foo: 1 }
Object.observe(obj, function (changes) {
console.log(changes)
})
obj.foo = 2
正如预期的那样,这将记录一个包含我所做更改的对象。所以问题是如何在没有这种副作用的情况下更改属性?
嗯,Object.observe 设计的目标之一是随时捕捉对象的所有变化。
答案取决于您实际需要什么。例如,下面的代码不会导致对象上的更改事件:
var obj = { foo: [1] }
Object.observe(obj, function (changes) {
console.log(changes)
})
obj.foo[0] = 2
从技术上讲,对象本身不会改变。
一种可能的选择是提供您自己的、已修补的 Object.observe 实现,该实现将仅在某些标志打开时通知观察者。
或者,使用一些更高级别的惯用语,例如 pubsub 机制,您可以在其中管理“更改”事件的排放。