Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何侦听动态添加的对象字段中的更改?_Javascript - Fatal编程技术网

Javascript 如何侦听动态添加的对象字段中的更改?

Javascript 如何侦听动态添加的对象字段中的更改?,javascript,Javascript,我希望扩展对象类和数组类,以便能够在构建之后监听对它们的实例所做的任何更改 我现在能做的最好的事情就是为实例初始化/构造时给定的字段添加自定义get和set函数: var myObj = new CustomObject({name:'foo'}); myObj.name = 'bar'; // this will log "'name' in 'myObj' updated:'bar'" //however: myObj.age = 85; // this mutation will s

我希望扩展对象类和数组类,以便能够在构建之后监听对它们的实例所做的任何更改

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

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'"
注意:我正在寻找一种不涉及轮询的解决方案。

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

提前谢谢

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

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

发件人:


那么您想查看任何属性吗?是的,确切地说,不是侦听预定义的字段集,而是侦听正在调用的函数来创建新字段,并在我说myObj.randomfieldname=somevalue时设置其值;好吧,我想你已经知道了,但我要说的是,你根本不可能让这样的东西正常工作,并且拥有相当好的浏览器支持。这似乎正是我想要的,但不是我想要的(需要更多的浏览器支持):(感谢您的帮助,我找到了另一篇关于代理和Harmony的文章:很遗憾现在只有Firfox支持它,我真的很想用一个完整的解决方案来解决这个问题。我想现在需要一个字段名列表。@Marcus:不客气。代理一旦获得支持,将非常棒。
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;

}