2011-02-10 73 views
0

我想知道是否有人也許能幫助我的東西,我認爲它相當簡單:擴展原始的JavaScript類型

基本上我要擴展的所有數據類型(包括固有類型)的原型,允許一些種自定義功能,可以考慮:

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

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

x.onChange(); 
y.onChange(); 

這是基本的想法IM後,但真的是我想要的是居然有的onChange(在這個例子中)是不同的,所以對實際變量的新功能(而不是標準原型擴展),即:

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

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

這似乎不起作用,但我必須失去一些很簡單的東西沒有?我的意思是我可以擴展所有的對象和類型,並添加新的功能...不是嗎?

任何幫助將不勝感激!

回答

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

這可以被用來觀察任何價值變動(只要該值再變可觀察的類 - 一個小的貶低海事組織)。

像這樣將與上面的代碼工作:

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); 

活生生的例子在這裏 - >http://jsfiddle.net/MeAhz/

0

擴展對象原型:

Object.prototype.foo = function() { alert('hello world'); }; 
var a = 1; 
a.foo(); 
+3

請永遠不要做:http://erik.eae.net/archives /2005/06/06/22.13.54/ – 2011-02-10 12:25:42

+2

@insin:FWIW,ECMA-262第5版的defineProperty()可以通過定義不可枚舉的屬性來解決特定的投訴。所以可以使用`Object.prototype.hasOwnProperty()`。 – 2011-02-10 13:08:48