0

我想了解JavaScript的繼承/原型。試圖瞭解/學習/使用繼承與JavaScript。原型屬性

我這樣做:

function Foo(par){ 
    this.prop= par; 
    this.propTwo = par; 
} 
function Bar(par){ 
    this.p=par; 
} 
Bar.prototype = new Foo(); 

如果我做的:

var myBar = new Bar("value"); 

myBar.propTwo是不確定的(我想這是因爲,即使我重寫原型,我明確地使用Bar「建設功能「< <請糾正我,如果我在這個假設是錯誤的

如果我想那Bar繼承自Foo,我應該如何創建Bar的實例或重寫構造函數以在創建myBar對象時同時定義/分配propTwo(注意將相同的參數傳遞給兩個道具)?

我甚至不確定我是否在這裏做一些「好」的事情,所以如果我完全錯了,可以說,如果可以修復,請不要猶豫。

更新: 我已選擇Ethan Brown's答案爲正確的,因爲1分鐘。差異(沒有個人)。兩種解釋都運作良好,並使用兩種不同的方式(實際上這個想法是相同的,一個使用「應用」另一個「呼叫」)。

而且Bergi's鏈接/發表評論它原來是爲什麼不使用這種方法延長接聽/理由:

What is the reason to use the 'new' keyword here?

感謝您的答案/材料。

+0

[正確的JavaScript繼承](http:// stackoverflow。com/questions/10898786/correct-javascript-inheritance) – Bergi

+1

這段代碼將會在Bar的構造函數中產生一個引用錯誤:'prop'是未定義的。這是一個錯字嗎?應該是'this.p = par;'? –

+1

你正在執行沒有參數的'Foo()',這個'this.prop'和'this.propTwo'只是未定義的... – fiddler

回答

2

如果我理解你的問題正確,你想知道爲什麼proppropTwo不在myBar設置,當你宣稱Bar是的Foo一個子類。

答案是構造函數不會自動調用其原型的構造函數。我想你也許想要的東西是這樣的:

// parent class 
function Foo(par){ 
    this.prop = par; 
    this.propTwo = par; 
} 

// subclass 
function Bar(par){ 
    Foo.call(this, par); // invoke parent class constructor 
    this.p = par;   // custom construction 
} 
Bar.prototype = new Foo() 

正如BERGI在下面的評論中指出,子類的子類的原型設置父類的一個新實例可能是你想要的東西:使所有亞型實例從父類的實例繼承,而不是父類的原型。如果你正在尋找效仿經典的繼承,最好的辦法是使用Object.create方法:

Bar.prototype = Object.create(Foo.prototype); 
Bar.prototype.constructor = Bar; 

更多信息,請參見MDN documentation on Object.create。您也可能想要閱讀link Bergi mentionedthis SO question

+0

請在[爲什麼不以用於建立原型'new']閱讀(http://stackoverflow.com/q/12592913/1048572) – Bergi

+0

是的,你說得對,謝謝,BERGI。我只是在沒有編輯的情況下複製OP代碼,但我會更新我的答案。 –

+1

你說得對,我試圖約「經典傳承」的一個例子,但樣本並未顯示/提及關於使用申請/電話,我得到了stucked那裏(直到幾分鐘後,他們提到您的回答/貼正是)該示例剛剛展示了我發佈的內容,並且我非常困惑,感謝您的解釋和信息,它將繼續我在js和功能繼承方面的發展:) – Allende

1

您需要在Bar的「上下文」(或範圍)中調用Foo函數。效果就像調用Foo作爲父構造函數一樣。

function Foo(par){ 
     this.prop= par; 
     this.propTwo = par; 
    } 
function Bar(par){ 
     this.p=par; 
     Foo.apply(this,arguments); 
    } 
Bar.prototype = new Foo(); 

var myBar = new Bar("value"); 

console.log(myBar); 
+1

請閱讀[爲什麼不使用'新'設置原型](http://stackoverflow.com/q/12592913/1048572) – Bergi