よく、 Object.watch()のプロパティを使用できます。
しかし、すべてのブラウザでサポートされていないため、 Polyfillをファイルに追加する必要があります。
これらのレディメイド関数の他に、setTimeout()またはwindow.requestAnimationFrame()を使用して独自の関数を記述できます。この関数では、連続するスレッドの関数の特定のプロパティをチェックできます。
例:
var threadCheck = requestAnimationFrame ||
webkitRequestAnimationFrame ||
mozRequestAnimationFrame ||
oRequestAnimationFrame ||
msRequestAnimationFrame ||
function(callback) {
setTimeout(callback, 16);
},
oldProperty = {},
watchFunction = function (obj, objProp) {
var len = objProp.length,
prop,
i;
for (i= 0; i < len; i++) {
prop = objProp[i];
oldProperty[prop] = obj[prop];
}
checkFunction();
},
checkFunction = function() {
var prop;
for (prop in oldProperty) {
if (oldProperty[prop] !== obj[prop]) {
executeFunction();
oldProperty[prop] = obj[prop];
}
}
threadCheck(checkFunction);
},
executeFunction = function() {
console.log('changed')
},
obj = {
propertyA : function() {},
propertyB : 'check',
propertyC : {
dummy : 'xyz'
},
propertyD : 999
};
watchFunction(obj, ['propertyA', 'propertyB', 'propertyC', 'propertyD']);
結果(Chromeブラウザのコンソールで指定されたコードを実行しているが、それは改善の多くのスコープがあり、ちょうどプロトタイプです。またunwatch()関数が実装される必要があります。):
obj.propertyA = function(){}
(){}
VM1016:35 changed
obj.propertyB = 'check'
"check"
obj.propertyB = 'check1'
"check1"
VM1016:35 changed
obj.propertyB = 'check1'
"check1"
obj.propertyB = 'check2'
"check2"
VM1016:35 changed
obj.propertyA = 'check2'
"check2"
VM1016:35 changed
obj.propertyA = function(){}
(){}
VM1016:35 changed
obj.propertyD = 999
999
obj.propertyD = 99
99
VM1016:35 changed
obj.propertyD = 991
991
VM1016:35 changed
それは得策ではないが常に可能です。 –
@kingshuk bask:オブジェクト変数に何かを割り当てると、元のオブジェクト変数を上書きしますが、そのアクションメソッドをどのようにトリガーしますか? –
オブジェクトのプロパティの現在の値と以前の値が同じか違うかを連続したスレッドでチェックするヘルパ関数が必要です。 @deepak bhatia –