2013-11-25 152 views
1

對象如何從JavaScript中的多個父項繼承?原型繼承和原型屬性

我想到一個這樣做:

Fruit.prototype = new Plant(); 
Fruit.prototype = new anotherPlant(); 

但會出現什麼水果的原型屬性(原型對象)被置到?它仍然是Fruit的原始Parent構造函數的原始Parent.prototype嗎?

+0

檢查了這一點http://stackoverflow.com/questions/9163341/multiple-inheritance-prototypes-in-javascript – PSL

回答

1

你不能。事實上,沒有多少種語言支持多重繼承。

所有你做的有中Fruitprototype設置的Plant一個實例,然後覆蓋它與anotherPlant一個實例。它和簡單一樣;

Fruit.prototype = new anotherPlant(); 

但是,不要忘記,JavaScript有一個繼承鏈。使用上面的內容,如果anotherPlant的原型爲Plant,則可以從兩個對象繼承。

function Plant() { 

} 

Plant.prototype.foo = 'foo'; 
Plant.prototype.baz = 'baz-a'; 

function AnotherPlant() { 

} 

AnotherPlant.prototype = new Plant(); 

AnotherPlant.prototype.bar = 'bar'; 
AnotherPlant.prototype.baz = 'baz-b'; 

var a = new AnotherPlant(); 

console.log(a.foo); // foo 
console.log(a.bar); // bar 
console.log(a.baz); // baz-b 

JavaScript的繼承與其他大多數語言不同,它使用原型繼承,這意味着通過遵循用於創建實例的構造函數的prototype屬性,該語言確定函數的繼承鏈(類別,類別,如果這使得它更容易)。

+0

嗯....馬特如果我也做Fruit.prototype = new Plant();我將原型屬性(不是原型屬性)設置爲指向Plant.prototype因此,原型具有兩個特徵,即它用於定義子級繼承的原型屬性以及指向父級的原型屬性。即它做同樣的事情做兩件事? – Tomatoes

+0

@Tomatoes:如果你這樣做,你會繼承'Plant'的'foo'和'baz'屬性。你期望發生什麼? – Matt

+0

srry我不清楚,我試圖區分原型屬性和原型屬性,並試圖找出Fruit.prototype = new Plant();它影響的聲明。看起來像這樣的一個陳述可能會做兩件事。繼承=繼承Plant.prototype方法並指定Plant.prototype作爲其原型對象(父指針)。 – Tomatoes