2012-12-06 128 views
0

也許有人可以向我解釋,爲什麼我不能從B的原型級重寫方法moep。我找到了一個例子(http://stackoverflow.com/questions/11148960/javascript-prototype-method-override-not-found),如果我用B.prototype =重寫函數= ...它的作品。那麼,爲什麼我必須指定.prototype來覆蓋函數呢?Javascript覆蓋原型方法

問候 - 托馬斯

A = function() { 
    this.moep = function() { 
     alert("Im in class A!"); 
    }; 
}; 

B = function() { 
}; 

B.prototype = new A(); 
B.moep = function() { 
    alert("Im outside!"); 
}; 

var keks = new B(); 
keks.moep(); // Alerts "Im in class A" 
+0

B的構造函數現在是A的構造函數,所以當你調用新的B()時,你得到一個A集B的prototype.constructor自己 – kinakuta

+0

@kinakuta:*「B的構造函數現在是A的構造函數」*不,它不是。 –

+0

@ T.J.Crowder嗯,照顧解釋? – kinakuta

回答

3

你(內Bthis.moep分配給B.moep,不B.prototype.moep或。 B.moep根本不參與原型鏈。

當您創建通過new <functionname>對象,該對象的原型是由<functionname>.prototype設置。因此,如果您想覆蓋由A分配的moep到由new A創建的實例並將其分配給B.prototype,則需要將其分配給B.prototype

+0

FWIW,如果你有興趣在JavaScript中做類似類的層次結構,我已經寫了一個名爲['Lineage'](http://code.google.com/p/lineagejs/)的小工具箱腳本。即使你不想直接使用它,它使用的技術可能是有用的,完整(評論)的源可用。 –

+0

謝謝,現在對我來說更加清晰:) –