如何检查对象是否被修改
我有一个对象,例如:
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()
函数。