たとえば、次のようなオブジェクトがあります。
var o = {
a: 1
};
ユーザーは次のことを行います。
o.a = 2;
o
オブジェクトが変更されたかどうかを知るにはどうすればよいですか? 物に触れられないo
ので使えませんObject.defineProperties()
。
たとえば、次のようなオブジェクトがあります。
var o = {
a: 1
};
ユーザーは次のことを行います。
o.a = 2;
o
オブジェクトが変更されたかどうかを知るにはどうすればよいですか? 物に触れられないo
ので使えませんObject.defineProperties()
。
あなたは node.js 環境にいるので、粗悪な古い JavaScript エンジン (つまり古いブラウザー) を気にする必要がないので、アクセサー関数Object.defineProperty()
でプロパティを定義するために使用できます。これにより、特定のプロパティが読み書きされるたびにカスタム関数を実行できます。そのため、書き込みを簡単にログに記録して、別のプロパティに保存することができます。
var o = {};
Object.defineProperty(o, 'a', {
get: function() {
return this.__a;
},
set: function(value) {
this.__a = value;
this.__a_changed = true;
}
});
o.__a = 1;
プロパティに値が割り当てられるたびに設定されo.a
ます。__a_changed
もちろん、関数内で変更時にやりたいことを実行する方がよりクリーンになりset
ますが、便利な方法で実行できるかどうかは明らかにコードに依存します。
最も簡単な方法は、値が初期化した値と異なるかどうかを確認することです。別のオプションは、を使用すること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
}
});
がうまくいかない o
場合は、いつでも独自のセッターゲッターでラップできます。defineProperty
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
より良い解決策は、何かを実行するようなものを使用してイベントを実行することBackbone.Events
です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);
Underscore
ここではライブラリのextend
メソッドを使用しています。
var o_backup = o.a;
if(o.a != o_backup){
// function to execute
}
a
基本的には、オブジェクトからを保存する変数を作成し、o
それが変更されているかどうかを確認しているだけです。
また、setInterval()
複数回変更されているかどうかを確認したい場合は、関数を実行できます。