跟踪对象是否已更改

时间:2011-05-10 15:30:15

标签: javascript object

// A simple Javascript Object / String
var object = "hello";

// Imagine a button in the DOM, and if it's clicked the object value will change
document.getElementById("button").onclick = function(){
   window.object = "hello world";
}

// Now I would like to track and do something when the object is changed, ex:
object.onreadystatechange = function(){
   alert(object);
}

注意:这听起来很愚蠢,因为我可以在按钮上的onclick事件中进行更改,但这不是我想要的,我想严格跟踪对象本身的变化对于任何类型的使用,上面的代码只是一个例子。

5 个答案:

答案 0 :(得分:6)

Javascript不允许您在任意对象/变量上设置程序化观察点/事件。

您可以使用封装来隐藏对象内部的各个值,只允许通过具有您想要的副作用的专用“setter”函数来修改它们。

答案 1 :(得分:5)

您可以使用get和set方法将其设为实际对象:

// A simple Javascript Object 
var object = new (function(){
    this.text = 'hello';

    this.setText = function(msg){
         this.text = msg
         //on change event
    }
})();

// Imagine a button in the DOM, and if it's clicked the object value will change
document.getElementById("button").onclick = function(){
   object.setText('New Text');
}

这是一个演示小提琴:http://jsfiddle.net/maniator/BSYpz/

答案 2 :(得分:4)

您可以使用此处所述的Getters and Setters跟踪JavaScript对象,

http://ejohn.org/blog/javascript-getters-and-setters/

你也可以看一下,

Javascript getters and setters for dummies?

答案 3 :(得分:3)

无论您想使用什么框架,在属性更改时自动触发事件都没有魔力。在你的情况下,你应该做的可能是围绕这些数据创建一个对象,并且只为它公开get和set方法:

var something = function()
{
    var value = 10;

    this.getValue = function()
    {
        return value;
    }

    this.setValue = function(newValue)
    {
         ValueChanging(value, newValue);
         value = newValue;
    }

    var ValueChanging = function(old, new)
    {
         // Do Something
    }
}

答案 4 :(得分:3)

最新的Google Chrome版本(例如,启用“启用实验性JavaScript”标记的测试版)支持Object.observe()API。有关RESPOND TO CHANGE WITH OBJECT.OBSERVEworking example

的更多信息