1

構築後にインスタンスに加えられた変更をリッスンできるように、Object クラスと Array クラスを拡張したいと考えています。

私が今できる最善の方法は、インスタンスの初期化/構築時に指定されたフィールドにカスタムの 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'"

注:ポーリングを伴わない解決策を探しています。

私が今持っているもの(最初のコードブロックに示されている機能をもたらします):

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;

}

前もって感謝します!

4

1 に答える 1

2

Firefox (mozilla) にはProxy、これを行うことができるというものがあります。

MDN プロキシ ドキュメント

これは現在非標準の機能ですが、ECMAScript 6 の一部(または同様のもの)になる可能性があるようです。

http://wiki.ecmascript.org/doku.php?id=harmony:proposalsから:

ここに画像の説明を入力

于 2012-04-13T17:34:19.367 に答える