2009-08-09 74 views
1

我有以下PROG在java腳本繼承中堆棧流!

Object.prototype.inherit = function(baseConstructor) { 
    this.prototype = (baseConstructor.prototype); 
    this.prototype.constructor = this; 
}; 
Object.prototype.method = function(name, func) { 
    this.prototype[name] = func; 
}; 

function StrangeArray(){} 
StrangeArray.inherit(Array); 
StrangeArray.method("push", function(value) { 
    Array.prototype.push.call(this, value); 
}); 

var strange = new StrangeArray(); 
strange.push(4); 
alert(strange); 

和伊倫當我得到疊翻轉過來流?任何想法爲什麼?

回答

6

您在設置StrangeArray.prototypeArray.prototype。稍後,您將(現在與Array.prototype相同)添加push方法。所以你有效地設置Array.prototype.push。您的push方法調用Array.prototype.push - 即它本身。所以它最終只會反覆調用自己,並且會導致堆棧溢出。

+0

非常感謝你 – ravi 2009-08-31 18:29:30

2

喬恩是對的。這是解決它的一種方法。而不是將StrangeArray.prototype設置爲Array.prototype,這會讓您將StrangeArray.prototype設置爲Array的新實例,因此它會繼承Array.prototype的屬性(不調用Array的構造函數)。

Object.prototype.inherit = function(baseConstructor) { 
    var tmp = Function(); 
    tmp.prototype = baseConstructor.prototype; 
    this.prototype = new tmp(); 
    this.prototype.constructor = this; 
}; 

編輯:

this.prototype = new baseConstructor(); 

作品在這個例子中,而不是在更復雜的方案好。如果基礎構造函數執行一些初始化(例如創建DOM元素,增加計數或連接到服務器),那麼在腳本加載時將發生所有初始化,而不是實例化子對象時。

解決這個問題的另一種方法是在構造函數中區分它是被調用繼承(分配給原型)還是僅用於實例化,然後在調用繼承時不執行初始化。但我更喜歡在繼承時不調用構造函數,因此在繼承時爲構造函數使用空函數。

我不是很擅長解釋這些東西。我建議克羅克福德的網站,也可以通過Javascript inheritance上的這些two articles

1

實際上,你只需要設置的實際對象的原型,到baseConstructor的新實例:

Object.prototype.inherit = function(baseConstructor) { 
    this.prototype = new baseConstructor(); 
}; 

我也建議你給看看這個Prototypal Inheritance技術,我發現非常乾淨。