2013-01-06 20 views
5

を変更されているかどうかを確認する方法:オブジェクトが、私は、たとえば、オブジェクトを持っている

var o = { 
    a: 1 
}; 

ユーザーが行います。

o.a = 2; 

oオブジェクトが変更された場合どのように知ることができますか?私はoオブジェクトに触れることができないので、Object.defineProperties()を使用することはできません。

+0

変更があったときに通知を受け取るか、確認する方法がありますか?チェックしたいだけの場合は、オブジェクトのハッシュコードを生成し、必要に応じて比較すると言うでしょう。 – Nic

+0

これをチェックする方法はありますが、このハッシュをどのように生成できますか? –

答えて

-1
var o_backup = o.a; 

if(o.a != o_backup){ 
// function to execute 
} 

基本的に、あなただけのオブジェクトoからaを保存する変数を作成しているし、それが変更されたかどうあなたはチェックしています。

また、複数回変更されているかどうかをチェックする場合は、setInterval()機能を使用できます。

+0

違反はありませんが、これはあまり優雅な解決策ではありません。 – Trevor

2

あなたはNode.jsの環境であり、したがって、あなたがアクセサ関数とプロパティを定義するObject.defineProperty()を使用することができます(すなわち、古いブラウザ)安っぽい古いJavaScriptエンジンを気にする必要はありませんので。これにより、特定のプロパティを読み書きするたびにカスタム関数を実行できるようになります。別のプロパティに格納します。値がo.aに割り当てられているときはいつでも

var o = {}; 
Object.defineProperty(o, 'a', { 
    get: function() { 
     return this.__a; 
    }, 
    set: function(value) { 
     this.__a = value; 
     this.__a_changed = true; 
    } 
}); 
o.__a = 1; 

__a_changedプロパティが設定されます。もちろん、set関数では、変更の際に何をしたいのかを実行することがよりクリーンになりますが、あなたが有用な方法で行うことができるのは明らかにあなたのコードに依存します。

+0

最初の答えと同じですが、私は 'o'オブジェクトに触れることができません。なぜなら、それはサードパーティのモジュールを持つ設定ファイルから作成されるからです。 –

+2

すべてのプレーンプロパティをアクセサ上のプロパティに変換できます。 – ThiefMaster

2

最も簡単なことは、明らかに値が初期化した値と異なるかどうかを確認することです。もう一つの選択肢はObject.definePropertyです。

var o = {}; 
var aValue = 2; 
Object.defineProperty(o, "a", { 
    get: function() { return aValue; }, 
    set: function(newValue) { 
     aValue = newValue; 
     // trigger event or set flag that it was changed 
    } 
}); 
+0

問題は、 'o'オブジェクトがサードパーティのモジュールを持つ設定ファイルから作成されているため、' o'オブジェクトに触れられないことです。 –

+0

本当に 'o'オブジェクトに触れることができないと仮定すると、値を期待値と照らし合わせる以外に多くのオプションがないかもしれません。通常のオブジェクトがプロパティを変更したときに自動的にトリガされるイベントはありません。 –

0

definePropertyがあなたのために仕事をしていない場合は、常に独自のセッターゲッターとoをラップすることができます。

var myO = { 
    o: o, // original o 
    changed: false, 
    set: function (prop, val) { 
     this.o[prop] = val; 
     this[prop + "IsChanged"] = true; 
    }, 
    get: function (prop) { 
     return this.o[prop]; 
    } 
}; 
myO.set("a", 2); 
console.log(myO.aIsChanged); // true 

より良い解決策は、私がFYI、ここUnderscoreライブラリのextendメソッドを使用していmyO.on("change", function() { ... })

var myO = { 
     o: o, // original o 
     changed: false, 
     set: function (prop, val) { 
      this.o[prop] = val; 
      this.trigger("change", prop, val); 
     }, 
     get: function (prop) { 
      return this.o[prop]; 
     } 
    }; 

_.extend(myO, Backbone.events); 

myO.on("change", function (prop, val) { 
    // Do stuff with the change 
}); 

myO.set("a", 1); 

いろいろ書いをexeuteするBackbone.Eventsのようなものを使用してイベントを実行することです。

関連する問題