观察现有对象上的对象属性变化

过去可以调用Object.observe()任何对象,然后在修改属性时接收回调。但是,它已被弃用,我们获得了代理getter 和 setter作为替代方案。但都不允许将侦听器附加到现有对象,该对象的引用已存储在其他地方。以这段代码为例:

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被声明为 a const,因此不能使用 Proxy 重新定义

  • state通过引用传递给内部函数,因此即使state重新定义,该函数仍将继续使用原始对象

虽然这可以通过setInterval不断地将其state.attr与之前版本的自身进行比较来实现,但它无法捕捉到setInterval调用之间发生的变化,并且总是会有滞后。

是否有任何鲜为人知的方法可以实现这一目标?


慕尼黑8549860
浏览 224回答 1
1回答

Cats萌萌

Object.defineProperties分别使用 Object.defineProperty在现有对象上创建 getter 和 setter。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript