我听说JavaScript中不支持多重继承。
以下示例是否可以被视为多重继承如果没有,那么任何人都可以解释为什么......?
function A () {
this.a = 'a'
};
function B () {
this.b = 'b'
};
function AB () {
A.call(this);
B.call(this);
};
var obj = new AB();
console.dir(obj);
//Output: {a: "a", b: "b"}
答案 0 :(得分:3)
以下示例是否可以被视为多重继承?
没有
任何人都可以解释原因吗?
您的AB
(我将从此处开始调用C
)功能实际上不会扩展A
,也不会扩展B
:
function A () {
this.a = 'a';
}
function B () {
this.b = 'b';
}
function C () {
A.call(this);
B.call(this);
}
a = new A();
console.log('a is A', a instanceof A);
b = new B();
console.log('b is B', b instanceof B);
c = new C();
console.log('c is A', c instanceof A, 'c is B', c instanceof B);
在该示例中,您根本没有任何继承。你做有功能组合。
如果您想继承,C
函数需要有一个指向A
或B
实例的原型:
function A () {
this.a = 'a';
}
function B () {
this.b = 'b';
}
function C () {
A.call(this);
B.call(this);
}
C.prototype = new A();
//or
//C.prototype = new B();
a = new A();
console.log('a is A', a instanceof A);
b = new B();
console.log('b is B', b instanceof B);
c = new C();
console.log('c is A', c instanceof A, 'c is B', c instanceof B);
请注意,因为C
函数只有一个原型,所以只能有一个继承。
对于对象组合,通常会看到以下行的模式:
function A () {
this.a = 'a';
}
function B () {
this.b = 'b';
}
function C () {
this.a = new A();
this.b = new B();
}
a = new A();
console.log('a is A', a instanceof A);
b = new B();
console.log('b is B', b instanceof B);
c = new C();
console.log('c.a is A', c.a instanceof A, 'c.b is B', c.b instanceof B);
答案 1 :(得分:2)
您所做的工作称为composition
,它通常是多重继承的替代方案。
以下是一些可能对您有帮助的参考资料