观察现有对象上的对象属性更改

时间:2019-06-19 19:01:12

标签: javascript

过去曾经可以在任何对象上调用Object.observe(),然后在修改属性时接收回调。但是,不推荐使用它,我们给了Proxiesgetters 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调用之间发生的更改,并且总是有延迟。

还有什么鲜为人知的方法可以实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

分别使用Object.definePropertiesObject.defineProperty在现有对象上创建吸气剂和吸气剂。