2013-12-18 108 views
0

讓我們有2個構造雜質VS原型繼承

bird= function(name){ 
    this.cry=function(){ alert('cry'); } 
    this.name=name; 
} 
duck= function(){ 
    this.cry=function(){ alert('cry cry'); } 
} 
b= new bird('Ivan'); 
d= duck.call(b); 

,並考慮原型繼承

bird= function(name){ 
    this.cry=function(){ alert('cry'); } 
    this.name=name; 
} 
duck= function(){ 
    this.cry=function{ alert('cry cry'); } 
} 
duck.prototype= new bird('Ivan'); 

你可以得到一個例子,當原型繼承更好,然後雜質的方法,當雜質更好然後原型繼承。

+2

在你的第一個例子中,根本沒有繼承。您只需將構造函數作爲函數調用,並將bird的實例作爲'this'與'duck.call(b)'綁定並覆蓋現有的'b'實例的方法。 * FYI *變量'd'在你的情況下是無用的。 – Givi

+0

可能的重複[什麼時候應該選擇原型繼承vs功能繼承?](http://stackoverflow.com/questions/16135369/when-should-one-choose-prototypal-inheritance-vs-functional-inheritance) – Bergi

回答

1

您不應該創建Parent的實例來設置繼承的原型部分(使用Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child)。

構造函數應該以Capital(大寫字母)開頭。

您可以通過在構造函數(第一個示例)函數中填充所有內容並在Child中執行Parent.apply(this,arguments);,但Child將無法擴展Parent函數,並且需要更多cpu和內存來創建Child和Parent的實例。

您的第二個示例使用原型的方式是錯誤的,您將共享行爲設置爲鴨原型(名稱成員)上的實例成員(cry函數)和實例特定成員。至於使用原型在第一個例子中的優勢(如果做得正確)您提供:

  1. 可以在兒童重新使用母公司的功能和對他們延長,如果你想
  2. 它使用較少的內存和更少的cpu來初始化實例,因爲原型成員是共享的。
  3. 您可以在創建實例之後在原型上添加行爲,並讓所有現有實例具有該行爲。
  4. 其他JS程序員會更好地理解你的代碼,並認爲你知道你在做什麼。

關於構造函數和原型的更多細節可以參見here