如何检查对象是否被修改

我有一个对象,例如:

var o = { a: 1 }; 

用户确实:

 oa = 2; 

我怎么知道o对象是否被修改? 我不能碰o对象,所以我不能使用Object.defineProperties()

由于你在node.js环境中,因此不必关心蹩脚的旧JavaScript引擎(即旧浏览器),所以可以使用Object.defineProperty()来定义具有访问器函数的属性。 这允许您在读取/写入特定属性时执行自定义函数 – 因此您可以简单地logging写入操作,并将其存储在单独的属性中。

 var o = {}; Object.defineProperty(o, 'a', { get: function() { return this.__a; }, set: function(value) { this.__a = value; this.__a_changed = true; } }); o.__a = 1; 

只要将值分配给oa__a_changed属性将被设置。 当然,在set函数中执行任何你想做的改变都会更清晰 – 但是如果你能以有用的方式做到这一点,它显然取决于你的代码。

最简单的事情显然是检查值是否与初始化值不同。 另一个select是使用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 } }); 

如果defineProperty不为你工作,你总是可以用你自己的setter getter来包装o

 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 

更好的解决scheme是使用类似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。

 var o_backup = oa; if(oa != o_backup){ // function to execute } 

基本上,你只是创build一个variables,将保存从一个对象o然后你检查是否已被修改或不。

另外,如果你想检查它是否被修改了多次,你可以做一个setInterval()函数。