2013-05-05 49 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