2013-05-27 56 views
1

JavaScript的大師,這是給你一個謎:奇怪的JavaScript原型繼承

function aFunc(){} 
function bFunc() {} 
aFunc.prototype = bFunc.prototype; 
a = new aFunc(); 
console.log(a instanceof bFunc); //true! 

爲什麼是bFunca實例?

我能理解這一點,如果是像這樣:

function aNext(){} 
function bNext(){} 
aNext.prototype = new bNext(); 
a = new aNext(); 
console.log(a instanceof bNext); 

..但與原型似乎很奇怪,我。上面的原型代碼的實際應用可以在專業的JavaScript for Web Developers書(第6章,最後幾頁)中找到。

編輯: 感謝攪拌機,但在這裏分別來自新的謎語: 現在如果我們有從單一的同一個對象他們的instanceof相互繼承(但它們是完全不同的)2個對象!

function Horse(){} //class chain can be very long 
function Pig(){} 
Horse.prototype = Object.prototype; 
Pig.prototype = Object.prototype; 
a = new Pig(); 
console.log(a instanceof Horse); //true! 

我們該如何解決問題?我如何確定豬不是一匹馬,如果它們都是動物(過去有相同的原型)?

+0

你想做什麼? – Blender

+0

您的Horse和Pig構造函數具有相同的原型,所以這就是爲什麼'a'是Horse的一個實例。確保使用'new Object()'而不是Object.prototype !! –

回答

5

the MDN來自:

instanceof操作者測試對象是否在其原型鏈有一個構造的prototype屬性。

所以在你的情況下,它測試bFunc.prototype是否在a的原型鏈中。由於,它會返回true

0

答案是: pig_instance.prototype = Object.prorotype = horse_instance.prototype,所以pig和horse來自同一個原型,instanceof檢查這個並返回TRUE。