javascript - 如何监听动态添加的对象字段的变化?

标签 javascript

我希望扩展 Object 和 Array 类,这样我就可以监听构造后对其实例所做的任何更改。

我现在能做的最好的事情是为实例初始化/构造时给定的字段添加自定义获取和设置函数:

var myObj = new CustomObject({name:'foo'});

myObj.name = 'bar'; // this will log "'name' in 'myObj' updated:'bar'"

//however:

myObj.age = 85; // this mutation will slip by unnoticed, 
                // since the 'age' field was never specified 
                // at initialization meaning no custom set / get 
                // functions where attached.

有没有办法实现下面的功能?

var myObj = new CustomObject();

myObj.name = 'foo';// this should log something like:
                   // "A new field 'name' was created for myObj with value 'foo'"

注意:我正在寻找不涉及轮询的解决方案。

我现在拥有的(产生第一个代码块中显示的功能):

function CustomObject(data) {

    var that = this;

    for(var field in data){         
        prepField(field);                                   
    }

    function prepField(field){                  
        Object.defineProperty( that, field, {
            set: function(val){         
                data[field] = val;
                console.log(field,'in',that,'updated:',val);
            },
            get: function(){
                console.log(field,'in',that,'requested');
                return data[field];                 
            },
            enumerable:true
        });         
    }

    return this;

}

提前致谢!

最佳答案

Firefox (mozilla) 有一个叫做 Proxy 的东西可以做到这一点。

MDN Proxy docs

目前这是一个非标准功能,但看起来它(或类似的东西)可能会成为 ECMAScript 6 的一部分。

来自 http://wiki.ecmascript.org/doku.php?id=harmony:proposals :

enter image description here

关于javascript - 如何监听动态添加的对象字段的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10145491/

相关文章:

javascript - 如何确认 href 标签中链接的导航?

javascript - JavaScript 中的 MVC : Should i use callback when instantiating the three entities?

javascript - 来自数据库的数据以 html 标签而不是格式化文本显示在网页上

javascript - 存储用户测验/测试答案的正确方法是什么?

javascript - req.body 没有出现在 postman 中

javascript - 为什么我的应用程序组件会呈现一个应用程序组件?

javascript - 访问 Vue 实例上不存在的属性失败

javascript - 如果一个JS 6模块被导入到一个页面的多个模块中,那么它的 "main line"代码是否只执行一次?

javascript - 在不同的列中显示 JSON 结果 Angular JS

javascript - sails create-callback 没有插入值