如何在javascript中继承2类

时间:2016-03-11 07:04:31

标签: javascript

我有A类和B类。我想使用C类继承这两个类。对于A类,我使用下面的代码 -

这对单班来说很好。现在我想继承B类。

function A () {
}

function B () {
}

function C () {
}

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

现在C如何继承A?

//B.prototype = Object.create(A.prototype);
//B.prototype.constructor = B;

3 个答案:

答案 0 :(得分:3)

一个对象只有一个单个原型链。除非A.prototypeB.prototype之间存在关系,否则它们都无法存在于单个对象的原型链中。

您可以创建一个新对象,其中包含A.prototypeB.prototype上的内容的组合,并将其用作C.prototype的对象:

function C() {
    A.call(this);
    B.call(this);
}
C.prototype = Object.assign({}, A.prototype, B.prototype); // Object.assign is
                                                           // ES2015, but can be
                                                           // shimmed
C.prototype.constructor = C;

...但请注意:

  1. 如果您之后在A.prototypeB.prototype添加/删除内容,则这些更改不会被C.prototype或通过new C创建的实例反映出来。< / LI>
  2. instanceof不会将通过new C创建的对象视为instanceof Ainstanceof B,因为A.prototypeB.prototype不在其原型中链。
  3. 如果A.prototypeB.prototype都具有相同的属性(例如,它们都覆盖toString),则只能拥有其中一个属性。 (在上面的代码中,B.prototype将获胜。)

答案 1 :(得分:0)

多重继承在JS中不起作用。

为什么不尝试像Mix-Ins / Traits这样的东西,而不是建立复杂的继承链?

您可以改为使用Traits,然后将其添加到宠物中,而不是试图确定WalkingSpeakingPet是否应继承WalkingPetSpeakingPet

function Walker (target) {
  return {
    walk (x, y) { console.log("I'm walking!"); }
  };
}

function Flyer (target) {
  return {
    fly (x, y, z) { console.log("I'm flying!"); }
  };
}

function Swimmer (target) {
  return {
    swim (x, y, z) { console.log("I'm swimming!"); }
  };
}


function Pet (type, name) {
  return { type, name };
}

function Dog (name) {
  const dog = Pet("Dog", name);
  return Object.assign(dog, Walker(dog));
}

function Parakeet (name) {
  const parakeet = Pet("Bird", name);
  return Object.assign(parakeet, Flyer(parakeet));
}

function HarveyTheWonderHamster () {
  const harvey = Pet("Hamster", "Harvey");
  return Object.assign(harvey, Walker(harvey), Flyer(harvey), Swimmer(harvey));
}

答案 2 :(得分:-1)

使用A类继承B类,然后C类继承A类。 Javascript仅适用于单一继承。