2012-04-13 18 views
1

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; 

} 

ありがとう!

+1

だから、*任意の*プロパティを監視したいですか? –

+0

はい、私はmyObj.randomfieldname = somevalueと言うとき、フィールドの定義済みのセットをリッスンするのではなく、新しいフィールドを作成してその値を設定するために呼び出される関数をリッスンします。 – Marcus

+0

さて、あなたはすでにそれを知っていると思いますが、私はちょうど、地獄では、うまく動作するようなものは得られず、適切なブラウザサポートが得られるとは言いません。 –

答えて

2

Firefox(mozilla)にはProxyという名前のものがあります。

MDN Proxy docs

これは、現在、非標準機能ですが、それ(または類似した何か)http://wiki.ecmascript.org/doku.php?id=harmony:proposalsからのECMAScript 6

の一部となることがあるかのように表示されます。

enter image description here

+0

これはまさに私が探しているものですが、正確には私が望んでいたものではありません(より多くのブラウザサポートが必要です):( – Marcus

+0

私を助けてくれてありがとう、私はプロキシとハーモニーに関する別の記事を見つけました: /soft.vub.ac.be/~tvcutsem/proxies/ Firfoxが今サポートしているのはあまりにも悪いですが、私は本当に完全な解決策を作りたいと思っていました。フィールド名の一覧は今のところ必要になるでしょう。 – Marcus

+0

@Marcus:あなたは大歓迎です。プロキシは、一度サポートが得られれば素晴らしいものになるでしょう。 –

関連する問題