过去曾经可以在任何对象上调用Object.observe()
,然后在修改属性时接收回调。但是,不推荐使用它,我们给了Proxies和getters and setters作为替代。但是,没有人允许将侦听器附加到现有对象,该对象的引用已经存储在其他位置。以下面的代码为例:
const state = {};
/* BEGIN Third party code */
(function runProcessing() {
setInterval(globalState => {
if (Math.random() > 0.5) {
globalState.attr = !globalState.attr;
}
}, 1000, state);
})();
/* END Third party code */
// TODO: run some function every time state.attr is changed
当前有两个问题:
state
被声明为const
,因此无法使用代理进行重新定义state
是通过引用传递给内部函数的,因此,即使重新定义了state
,该函数也将继续使用原始对象虽然可以使用setInterval
不断地将state.attr
与自身的先前版本进行比较,但是它无法捕获在setInterval
调用之间发生的更改,并且总是有延迟。
还有什么鲜为人知的方法可以实现这一目标吗?