7

我有一个对象,例如:

var o = {
  a: 1
};

用户这样做:

o.a = 2;

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

4

4 回答 4

3

由于您在 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函数中的更改执行任何你想做的事情会更干净——但它显然取决于你的代码,如果你能以一种有用的方式这样做。

于 2013-01-06T00:08:49.193 回答
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
    } 
});
于 2013-01-06T00:09:55.917 回答
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方法,仅供参考。

于 2013-01-06T03:56:48.213 回答
-1
var o_backup = o.a;

if(o.a != o_backup){
// function to execute
}

基本上,您只是在创建一个变量,该变量a将从对象中保存o,然后您正在检查它是否已被修改。

此外,setInterval()如果您想检查它是否已被多次修改,您可以执行一个功能。

于 2013-01-06T00:05:32.623 回答