我有一个对象,例如:如何检查对象是否被修改
var o = {
a: 1
};
用户执行:
o.a = 2;
我怎么能知道是否o
对象已被修改?我无法触摸o
对象,因此我无法使用Object.defineProperties()
。
我有一个对象,例如:如何检查对象是否被修改
var o = {
a: 1
};
用户执行:
o.a = 2;
我怎么能知道是否o
对象已被修改?我无法触摸o
对象,因此我无法使用Object.defineProperties()
。
var o_backup = o.a;
if(o.a != o_backup){
// function to execute
}
基本上,你只是建立一个变量,它保存a
从对象o
,然后,如果它已被修改或者不是你检查。
此外,如果您想检查它是否已被多次修改,您可以执行setInterval()
函数。
没有冒犯,但这不是一个非常优雅的解决方案。 – Trevor
既然你是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
函数中执行任何你想做的改变都会更清晰 - 但是如果你能以有用的方式做到这一点,它显然取决于你的代码。
与第一个答案相同,我无法触及'o'对象,因为它是使用第三方模块从配置文件创建的。 –
您仍然可以将所有普通属性转换为访问器支持的属性。 – ThiefMaster
最简单的事情显然是检查值是否与初始化值不同。另一种选择是使用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'对象,因为它是使用第三方模块从配置文件创建的。 –
假设你确实无法触及'o'对象,除了根据期望值检查值之外,可能没有太多选项。当一个普通的Ole对象有一个属性被改变时,没有任何事件会被自动触发。 –
你总是可以包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
东西exeute成才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
方法,执行事件仅供参考。
你想得到每一个改变的通知或只是有办法检查它吗?如果你只是想检查我会说生成对象的哈希码,并在必要时进行比较。 – Nic
只需要一种方法来检查它,但我怎样才能生成这个哈希? –