监听Javascript对象值的变化

12

使用jQuery或其他方法,是否可以监听非DOM JavaScript对象(或变量)的值的更改?例如,我有:

function MyObject()
{
    this.myVar = 0;
}

var myObject = new MyObject();
myObject.myVar = 100;

有没有一种方法可以监听 myVar 的值何时发生更改并调用一个函数?我知道我可以使用 getter/setters,但它们在早期版本的 IE 中不受支持。


可能是重复的问题:JavaScript - 监听对象属性的变化 - mplungjan
有一个提议中的 Object.observe(),可以参考此链接:https://developers.google.com/web/updates/2012/11/Respond-to-change-with-Object-observe - Sergey Ponomarev
3个回答

12

基本上你有两个选项

  • 使用非标准的watch方法,这只在Firefox中可用
  • 使用getter和setter,这些在较旧的IE版本中不受支持

第三个跨平台的选择是使用轮询,这并不是很好

watch的例子

var myObject = new MyObject();

// Works only in Firefox
// Define *watch* for the property
myObject.watch("myVar", function(id, oldval, newval){
    alert("New value: "+newval);
});

myObject.myVar = 100; // should call the alert from *watch*

获取器(getters)和设置器(setters)的示例

function MyObject(){
    // use cache variable for the actual value
    this._myVar = undefined;
}

// define setter and getter methods for the property name
Object.defineProperty(MyObject.prototype, "myVar",{
    set: function(val){
        // save the value to the cache variable
        this._myVar = val;
        // run_listener_function_here()
        alert("New value: " + val);
    },
    get: function(){
        // return value from the cache variable
        return this._myVar;
    }
});

var m = new MyObject();
m.myVar = 123; // should call the alert from *setter*

当你说“旧版IE”时,是否包括IE8?我知道它很老,但它支持getter和setter吗? - evolutionxbox
这个答案是从2011年的。当时IE8还不算太老。 - Andris

4

这可能是目前可用的最佳解决方案 - 它仍然排除了IE7,但在一个有IE的世界中,没有什么是完美的... :) - redhotvengeance
不留言就进行负评并不能帮助任何人。 - mplungjan

3
您可以基本实现这样的行为。
function MyObject(onMyVarChangedCallback)
{
    this.myVar = 0;

    this.setMyVar = function (val) {
       this.MyVar = val;

       if (onMyVarChangedCallback) {
           onMyVarChangedCallback();
       }
    }
}

function onChangeListener() {
   alert('changed');
}

var o = new MyObject(onChangeListener);

这个方法不能像设置setter那样工作,对吧?o.myVar = 100不会起作用,必须是o.setMyVar(100)。这就是我想避免的 - 我希望它像一个setter一样运行,但是当保持所有浏览器的支持时,似乎这是不可能的。 - redhotvengeance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接