2011-02-10 60 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