"多重继承"原型继承

时间:2014-11-26 17:08:18

标签: javascript inheritance mixins prototypal-inheritance

当两个基函数没有继承关系时,如何创建一个继承两个函数并尊重其原型更改的函数?

该示例演示了我想要的行为,因为c会对A.prototypeB.prototype进行修改。

function A() { }
function B() { }
B.prototype = Object.create(A.prototype);
function C() { }
C.prototype = Object.create(B.prototype); 

A.prototype.foo = "foo";
B.prototype.bar = "bar";

var c = new C();
console.log(c.foo); //prints foo
console.log(c.bar); //prints bar

然而,我没有B继承A的奢侈品。

function A() { }
function B() { }
function C() { }
C.prototype = //something that extends A and B even though B does not extend A.

A.prototype.foo = "foo";
B.prototype.bar = "bar";

var c = new C();
console.log(c.foo); //should print foo
console.log(c.bar); //should print bar

2 个答案:

答案 0 :(得分:2)

这是不可能的。

尝试使用mixin模式,或者具有C的属性继承自B,而另一个属性继承自A. 然后通过这些属性访问。

答案 1 :(得分:1)

您可以更改代码以执行此类操作

C.prototype.perform = function (key) {
    var args = Array.prototype.slice(arguments, 1);
    if (key in this)
        return this[key].apply(this, args);
    if (key in B.prototype)
        return B.prototype[key].apply(this, args);
    if (key in A.prototype)
        return A.prototype[key].apply(this, args);
    undefined(); // throw meaningful error
}

C.prototype.get = function (key) {
    if (key in this)
        return this[key];
    if (key in B.prototype)
        return B.prototype[key];
    if (key in A.prototype)
        return A.prototype[key];
}

然后像

一样使用它
var c = new C();
c.perform('toString');
c.get('foo');