2013-01-06 61 views
5

我有一个对象,例如:如何检查对象是否被修改

var o = { 
    a: 1 
}; 

用户执行:

o.a = 2; 

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

+0

你想得到每一个改变的通知或只是有办法检查它吗?如果你只是想检查我会说生成对象的哈希码,并在必要时进行比较。 – Nic

+0

只需要一种方法来检查它,但我怎样才能生成这个哈希? –

回答

-1
var o_backup = o.a; 

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

基本上,你只是建立一个变量,它保存a从对象o,然后,如果它已被修改或者不是你检查。

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

+0

没有冒犯,但这不是一个非常优雅的解决方案。 – Trevor

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函数中执行任何你想做的改变都会更清晰 - 但是如果你能以有用的方式做到这一点,它显然取决于你的代码。

+0

与第一个答案相同,我无法触及'o'对象,因为它是使用第三方模块从配置文件创建的。 –

+2

您仍然可以将所有普通属性转换为访问器支持的属性。 – ThiefMaster

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 
    } 
}); 
+0

问题是,我无法触摸'o'对象,因为它是使用第三方模块从配置文件创建的。 –

+0

假设你确实无法触及'o'对象,除了根据期望值检查值之外,可能没有太多选项。当一个普通的Ole对象有一个属性被改变时,没有任何事件会被自动触发。 –

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东西exeute成才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方法,执行事件仅供参考。