如何检查对象是否已被修改

时间:2013-01-06 00:00:14

标签: javascript node.js

我有一个对象,例如:

var o = {
  a: 1
};

用户:

o.a = 2;

如何知道o对象是否已被修改?我无法触及o对象,因此无法使用Object.defineProperties()

4 个答案:

答案 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()功能。