如何观察JS变量中的值变化

Ian*_*gan 2 javascript watch observable

我想知道是否有人可以帮助我做一些我认为相当直接的事情:

基本上我想扩展所有数据类型的原型(包括内部类型),以允许某种自定义函数,考虑:

var x = "some string";
var y = 101;

x = "some other value";
y++;

x.onChange();
y.onChange();
Run Code Online (Sandbox Code Playgroud)

这是我之后的基本思想,但我真正想要的是实际上让onChange(在这个例子中)与实际变量(而不是标准原型扩展)的新函数不同,即:

x.onChange = function() {
    alert("x.onChange");
}

y.onChange = function() {
    alert("y.onChange");
}
Run Code Online (Sandbox Code Playgroud)

这似乎没有用,但我必须错过一些非常简单的事情吗?我的意思是我可以扩展所有对象和类型并添加新功能......不是吗?

任何帮助将不胜感激!

Jam*_*iec 5

我可能不想尝试将方法添加到现有类型,而是创建一个可以包装主要类型的对象.我会称之为"观察"一个值,并可能实现如下:

function observable(v){
    this.value = v;

    this.valueChangedCallback = null;

    this.setValue = function(v){
        if(this.value != v){
            this.value = v;
            this.raiseChangedEvent(v);
        }
    };

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

    this.onChange = function(callback){
        this.valueChangedCallback = callback;
    };

    this.raiseChangedEvent = function(v){
        if(this.valueChangedCallback){
             this.valueChangedCallback(v);
        }   
    };
}
Run Code Online (Sandbox Code Playgroud)

然后可以使用它来观察任何值的变化(只要该值只能通过可观察类的方法改变 - 一个小的减法IMO).

这样的东西适用于上面的代码:

var obs = new observable(123);
obs.onChange(function(v){
         alert("value changed to: " + v);
     });

// the onChange callback would be called after something like obs.setValue(456);
Run Code Online (Sandbox Code Playgroud)

这里的实例 - > http://jsfiddle.net/MeAhz/