我有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;
答案 0 :(得分:3)
一个对象只有一个单个原型链。除非A.prototype
和B.prototype
之间存在关系,否则它们都无法存在于单个对象的原型链中。
您可以创建一个新对象,其中包含A.prototype
和B.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;
...但请注意:
A.prototype
或B.prototype
添加/删除内容,则这些更改不会被C.prototype
或通过new C
创建的实例反映出来。< / LI>
instanceof
不会将通过new C
创建的对象视为instanceof A
或instanceof B
,因为A.prototype
和B.prototype
不在其原型中链。A.prototype
和B.prototype
都具有相同的属性(例如,它们都覆盖toString
),则只能拥有其中一个属性。 (在上面的代码中,B.prototype
将获胜。)答案 1 :(得分:0)
多重继承在JS中不起作用。
为什么不尝试像Mix-Ins / Traits这样的东西,而不是建立复杂的继承链?
您可以改为使用Traits,然后将其添加到宠物中,而不是试图确定WalkingSpeakingPet
是否应继承WalkingPet
或SpeakingPet
。
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仅适用于单一继承。