2015-01-26 46 views
0

這是一個很好的繼承模式嗎?我從來沒有看到它在JavaScript繼承教程中討論,但有時在實際代碼中使用。你能否指出弊端和/或優於其他模式?在通過B.prototype = new A()的JavaScript繼承中,爲什麼需要設置B.prototype.constructor = B?

+1

*「你可以指出弊端和/或優於其他模式?」*請參閱我的[答案](http://stackoverflow.com/a/17393153/218196)。 – 2015-01-26 22:20:34

+0

@FelixKling正在等待你的反應:爲上帝而歡呼。 – Mouser 2015-01-26 22:21:11

+0

@ FelixKling謝謝,很好的回答,很透徹。儘管如此,它似乎並沒有解釋爲什麼這裏需要'B.prototype.constructor = B',是不是? B上總是有實際的構造函數,它是通過首先定義B隱式創建的,對吧?所以B.prototype.constructor永遠不應該使用,或者我錯過了什麼? – hubzkq1 2015-01-26 22:33:31

回答

0

由於構造函數現在指向構造函數(prototype屬性)的「A」 ,所以我們希望把它指向B()

B.prototype.constructor是一個指針到原來的構造函數時我們更改B的原型(B.prototype = new A())B.prototype.constructor失去對實際A()的引用並且將/指向B()。 注意新的A()仍然會調用默認的構造函數。

這裏只目的改回B()(B.prototype.constructor=B)可以是,當在未來一段目的調用具有原型像B.prototype.constructor()B.prototype.constructor.call()構造它不指向A()

實施例

function A(){ 
console.log("A") 
} 
function B(){ 
console.log("B") 
} 


B.prototype = Object.create(A.prototype); 

new B() // Still console.logs "B" 
B.prototype.constructor() // console.logs "A" 
+0

哈哈,以及來自AB我必須買它,謝謝 – hubzkq1 2015-01-26 22:22:32

+0

,不過,是嗎?因爲B上也有實際的構造函數,它首先通過定義B來隱式創建。所以B.prototype.constructor永遠不應該使用,或者我錯過了什麼? – hubzkq1 2015-01-26 22:34:47

+0

雖然它不會起作用,但默認的構造函數會被調用,但它可以很好地指向原型對象的構造函數 – 2015-01-26 22:41:58

相關問題