【问题标题】:Detect when a new property is added to a Javascript object?检测何时将新属性添加到 Javascript 对象?
【发布时间】:2011-02-16 01:14:26
【问题描述】:

使用内置 javascript 对象的简单示例: navigator.my_new_property = "一些价值"; //我们可以检测到这个新属性被添加了吗?

我不想不断地轮询对象来检查新属性。 是否有某种更高级别的对象设置器,而不是明确说明要监视的属性?

同样,我不想检测属性值是否发生变化,而是要检测何时添加了新属性。

想法? 谢谢

【问题讨论】:

    标签: javascript object properties


    【解决方案1】:

    ES6 引入了代理的概念: es6 proxies on MDN.

    这是一个简单的例子:

    let objectToSpy = {};
    let handler = {
        set: (target, prop, value)=>{
            console.log('new prop:', prop);
            target[prop] = value;
        }
    };
    
    let proxy = new Proxy(objectToSpy,handler);
    proxy.testProp = 'bla'; //prints: "new prop: testProp"
    

    【讨论】:

    • 这将记录每个属性更改,但添加一个额外的 if 语句将完成这项工作。 Fiddle谢谢
    【解决方案2】:

    不。确定何时写入属性的现有方法:

    • 使用 defineProperty(obj, name, fn) 定义的 ECMAScript 5 设置器;
    • 使用 __defineSetter__(name, fn) 定义的旧版 JavaScript 设置器;
    • 旧版 Netscape/Mozilla watch(name, fn);

    都是基于名称的,因此无法捕获使用以前未知名称编写的新属性。在任何情况下,navigator 可能是一个“宿主对象”,因此您不能依赖任何可用的普通 JavaScript Object 接口。

    轮询或提供回调的显式 setter 方法几乎是您所能做的。

    类似情况:Getter/setter on javascript array?

    【讨论】:

    • 感谢您的详细回复。如果我走轮询路线,您认为以毫秒为单位的好间隔是多少?显然,我希望它有效,但不要不必要地重复。是否有一些框架用于轮询的“标准”间隔?建议表示赞赏。
    • 我认为这将取决于您的目标是什么;没有一个答案。您正在轮询什么对象,您希望它多久更改一次,在其上定义了多少其他属性要通过?虽然您可以在现代桌面浏览器上以 50 毫秒之类的非常小的时间间隔侥幸逃脱,但对于像 IEMobile6 这样的弱浏览器上的填充良好的对象,可能会使其陷入困境!顺便说一句,对于像navigator 这样的主机对象,甚至不能保证设置任何新属性,或者使用for...in 来迭代它们,会起作用! :-S
    • 您已经无法捕获许多托管对象的属性更改(例如,尝试在各种 DOM 对象属性上定义 getter/设置),所以我看不出提供一般对象更改通知器会导致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2021-03-15
    • 2018-07-24
    • 1970-01-01
    • 2014-02-19
    相关资源
    最近更新 更多