这个例子可以被视为javascript中的多重继承吗?

时间:2016-07-20 16:33:15

标签: javascript inheritance

我听说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"}

2 个答案:

答案 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函数需要有一个指向AB实例的原型:

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,它通常是多重继承的替代方案。

以下是一些可能对您有帮助的参考资料