2

オブジェクトのプロパティが Javascript で変更されたかどうかを検出するにはどうすればよいですか? オブジェクトのプロパティの量が変化したとき (プロパティを取得したか失ったか) に関数を呼び出すことを特に検討しています。メソッドの使用を避け、オブジェクトのプロパティを設定および変更したいのですが、それはかなり不器用になり、setInterval明らかにオプションではありません。それで、これは可能ですか?


length編集:特に、Array オブジェクトにあるものと同様のプロパティを介してオブジェクトのプロパティの長さを取得する方法を探しています。インデックスが追加または削除されるたびに長さが変更されると思いましたが、どうやらそうではないようです。Javascript の元の設計者はこれをどのように管理したのでしょうか?

4

3 に答える 3

2

それを行う一般的な方法は、バックボーンがモデルを実行する方法と同様に、ゲッターとセッターのタイプの関数を使用することです。関数を介してデータを変更すると、関数は、実行したいことを実行する前に、追加の処理(リスナーの実行、プロパティの確認など)を実行します。

function ListenableObject(data){

    var that = this;
    this.data = data;
    this.listeners = [];

    this.edit = function(newvalues){
        //modify data
        //execute listeners
    }

    this.addListener = function(callback){
        that.listeners.push(callback);
    }
}

var mydata = new ListenableObject({'foo':'bar'});

mydata.addListener(function(){...callback...});

mydata.edit(somedata);
于 2012-05-14T13:42:35.787 に答える
1

あなたの要件に基づく短い答えは、あなたがやろうとしていることをすることは不可能だということです。少なくとも、まだです。コードへの影響を最小限に抑えて同じ機能を実現するために使用できる手法がいくつかあります。SO のどこかで見つけた、私の個人的なお気に入りの 1 つを次に示します。見つけたらリンクします。

function myObj(){

   var _this = this;

   // onUpdate callbacks
   this.onBeforeUpdate = [];
   this.onAfterUpdate  = [];

   this.UpdateProperty = function( prop, value ){

      // execute onBeforeUpdate callbacks...  
      for ( var i = 0; i < _this.onBeforeUpdate.length; i++ )
         _this.onBeforeUpdate[i]();

      _this[prop] = value;

      // execute onAfterUpdate callbacks...
      for ( var i = 0; i < _this.onAfterUpdate.length; i++ )
         _this.onAfterUpdate[i]();
   };

}

もちろん、プロトタイプの代入を自由に使用することで、この例のパフォーマンスをさらに向上させることができますが、その意図は理解できます。

于 2012-05-14T14:08:31.557 に答える
1

コメントで私が言ったことをすべて要約すると、ES6 は、「新しいプロパティ」や「プロパティの削除」などのイベントのハンドラーを有効にするプロキシを提供します。残念ながら、プロキシがクロスブラウザになるまでには何年もかかるでしょう。

オブジェクトのプロパティに関しては、そのためlengthのゲッター関数を定義できますが、IE は IE9 でしかゲッターを実装していないため、IE8 では機能しなくなります。それで、それはあなたにlength()方法を残します。そう:

function objectLength () {
    return Object.keys( this ).length;
}

次に、オブジェクトにこの関数があることを確認します (独自のプロパティまたは継承されたプロパティとして)。

yourObj.length = objectLength;

また

YourConstructor.prototype.length = objectLength;
于 2012-05-14T14:34:00.767 に答える