我有一个对象,例如:
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
用你自己的 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
方法,仅供参考。
var o_backup = o.a;
if(o.a != o_backup){
// function to execute
}
基本上,您只是在创建一个变量,该变量a
将从对象中保存o
,然后您正在检查它是否已被修改。
此外,setInterval()
如果您想检查它是否已被多次修改,您可以执行一个功能。