2012-04-13 20 views
1

我希望扩展对象和数组类,以便在构造后能够听取对其实例所做的任何更改。如何侦听动态添加的对象字段中的更改?

最好的我现在能做的就是添加自定义获取和设置功能在初始化/建筑实例的给定字段:

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; 

} 

提前感谢!

+1

所以你想看任何*属性? – 2012-04-13 17:33:27

+0

是的,而不是侦听预定义的字段集我宁愿听正在调用的函数来创建新字段,并设置它们的值,当我说myObj.randomfieldname = somevalue; – Marcus 2012-04-15 10:22:14

+0

好吧,我想你已经知道了,但让我只是说,地狱里没有办法让你获得像这样的工作,并有适当的浏览器支持。 – 2012-04-16 04:28:52

回答

2

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

MDN Proxy docs

这是目前非标准功能,但看来好像它(或类似的东西)可能变得的ECMAScript 6.

的一部分从http://wiki.ecmascript.org/doku.php?id=harmony:proposals

enter image description here

+0

这似乎确实是我正在寻找,但不完全是我所希望的(需要更多的浏览器支持):( – Marcus 2012-04-15 10:42:46

+0

谢谢你帮助我,但我发现了另一篇关于代理和和谐的文章:http:/ /soft.vub.ac.be/~tvcutsem/proxies/只有Firfox现在支持它,我真的希望这是一个完整的解决方案。我想现在需要一个字段名称列表。 – Marcus 2012-04-15 11:15:27

+0

@马库斯:不客气,一旦获得支持,代理将会非常棒。 – 2012-04-15 16:12:23

相关问题