我不明白爲什麼每個人都使用Boy.prototype = new Human;
來模擬繼承。看,我們想要的是A的功能嗎?我們可以做到這一點,而沒有實例化一個新的A(實際上實例化一個新的A會給我們帶來不希望的結果,因爲我們實際上正在運行實例化函數,這不是我們想要的)爲什麼我們要用`Boy.prototype = new Human;`來模擬繼承?
所以不是這個更好的解決方案?
for (var prop_name in Human.prototype) {
Object.defineProperty(
Boy.prototype,
prop_name,
Object.getOwnPropertyDescriptor(Human.prototype,prop_name)
);
}
說我們是那個特定的,並希望不僅是枚舉的屬性在Human.prototype我們仍然可以通過使用Object.getOwnPropertyNames
並調用它的原型鏈,這又是提供給我們通過Object.getPrototypeOf
實現它。
那麼當我們有更好的選擇時,做Boy.prototype = new Human;
模擬繼承的好處究竟是什麼呢?
你得到的名字'問題intermediate'漂浮在你的原型鏈而不是名字'superclass' – Raynos 2011-05-13 11:46:38
不是真的。首先沒有任何名字叫「中間」(這是一個匿名的構造函數 - 中間函數的作用域是擴展函數)。您可能會考慮這樣一個事實,即原型鏈中存在額外的對象是一個問題,但我認爲它實際上是正確的 - 額外的對象表示子類* class *。沒有它,沒有任何代表子類的東西。對象本身表示實例,對象的類應該位於原型鏈中。 – kybernetikos 2011-05-13 11:53:13
@Adam你的正確的超類對象仍然在鏈中,除非你有它和clazz之間的中間。這種模式只適用於小型連鎖店。如果你使用這個模式鏈接4次,那麼你的原型鏈中有8個對象。這會顯着增加遍歷時間並減慢代碼的速度。 – Raynos 2011-05-13 12:01:01