我有一个对象,例如:
var o = {
a: 1
};
用户:
o.a = 2;
如何知道o
对象是否已被修改?我无法触及o
对象,因此无法使用Object.defineProperties()
。
答案 0 :(得分:2)
由于您处于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
函数中执行你想做的任何改变甚至更干净 - 但是如果你能以一种有用的方式这样做,它显然取决于你的代码。
答案 1 :(得分: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
}
});
答案 2 :(得分:0)
如果o
没有为您完成工作,您始终可以使用自己的setter getter包装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
方法,fyi。
答案 3 :(得分:-1)
var o_backup = o.a;
if(o.a != o_backup){
// function to execute
}
基本上,您只是创建一个变量,它会从对象a
中保存o
,然后您正在检查它是否已被修改。
此外,如果您想检查它是否被多次修改,您可以执行setInterval()
功能。