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;
}
ありがとう!
だから、*任意の*プロパティを監視したいですか? –
はい、私はmyObj.randomfieldname = somevalueと言うとき、フィールドの定義済みのセットをリッスンするのではなく、新しいフィールドを作成してその値を設定するために呼び出される関数をリッスンします。 – Marcus
さて、あなたはすでにそれを知っていると思いますが、私はちょうど、地獄では、うまく動作するようなものは得られず、適切なブラウザサポートが得られるとは言いません。 –