2013-05-05 70 views
3

我想讓一個對象從另外兩個對象繼承,但是像這樣做不起作用,我該如何讓它工作?如何讓對象繼承其原型中的兩個對象?

function a() { 

}; 

a.prototype.iamA = function() { 
alert("a"); 
}; 

function b() { 

}; 

b.prototype.iamB = function() { 
alert("b"); 
}; 

function ab() { 

}; 

ab.prototype = new a(); 
ab.prototype = new b(); 

console.log(new ab()); 

看來,原型被覆蓋我怎麼能添加到它,我自己也嘗試將它添加到原型,但這也不管用?

+0

這是不可能的。在JS中,一個對象只能從另一個對象(或'null')繼承 – Bergi 2013-05-05 13:07:59

回答

8

使用對象擴展,而不是分配,e.g:

function extend(obj, source) { 
    for (var prop in source) { 
     obj[prop] = source[prop]; 
    } 
    return obj; 
} 

則:

ab.prototype = extend(new a(), new b());   (1) 

或者你可以選擇使用下劃線的extend function

ab.prototype = _.extend({}, new a(), new b()); (2) 

編輯

嚴格地說,這是mixin代替真正的多繼承,因爲 (new ab instanceof b) === false在兩者(1)和(2)。

欲瞭解更多的信息,請看看這個參考:No multiple Inheritance

這就是說,mixin對你來說可能就足夠了。事實證明,認爲他們需要繼承的人通常只需要重用代碼,而不需要與打字相關的構造。 這對於像這樣的dynamic typing(或duck typing)語言尤其如此。

+0

請注意,這裏既不inst'也不'inst instanceof b'允許評估爲true,其中'inst'是'ab的一個實例'。無論如何,+1,因爲這是我會建議的。 ;) – Kiruse 2013-05-05 09:28:23

+0

感謝這正是我所需要:) – user2251919 2013-05-05 09:35:48

+0

@ Derija93你是對的,我在我的答案中添加了這個事實。 – 2013-05-05 10:28:02