2016-03-11 39 views
2

2级我有A类和B我想继承使用C类的一类两个班,我使用下面的代码 -如何继承在JavaScript

它的工作的罚款单类。现在我想继承类B.

function A() { 
} 

function B() { 
} 

function C() { 
} 

C.prototype = Object.create(A.prototype); 
C.prototype.constructor = C; 
+0

希望这有助于http://stackoverflow.com/questions/9163341/multiple-inheritance-prototypes-in-javascript –

+0

注:在你的榜样,你错过了从''到A'必要呼叫C':'A.call(this);' –

回答

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创建的实例上。
  2. instanceof不会将通过new C创建的对象视为instanceof Ainstanceof B,因为A.prototypeB.prototype不在其原型链中。
  3. 如果A.prototypeB.prototype都具有相同的属性(也许它们都覆盖toString,例如),您只能有一个或另一个。 (在上面的代码中,B.prototype会赢。)
+0

我在这个代码上看到一个问题,你可以在这个链接上看到 - http://stackoverflow.com/questions/35988171/multiple-inheritance-console-output – pankaj98

+0

@ pankaj98 :是的,但这是一个不同的问题。 *据我所知,这个问题已被回答。 –

-1

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

0

多重继承在JS中不起作用。尽管如此,为什么不尝试像Mix-Ins/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)); 
}