我有一个现有的原型层次结构,我想修改它,以便层次结构保持不变,但会添加一个额外的原型。 Genre
应该对所有原型都返回true。
即:我说我有B-> A,我想让它成为B-> A-> Base。现在instanceof
应该为A,B,Base返回true。
我尝试使用B.prototype.prototype和Object.setPrototypeOf(),但两种情况都没有运气。
使用Object.setPrototypeOf()的示例:
instanceof
答案 0 :(得分:2)
这显示了从B到A的继承关系;
console.log(Object.getPrototypeOf(B.prototype) === A.prototype);
所以,鉴于此;
class A { do() { console.log("do A"); } }
class B extends A {
do() { console.log("do B"); }
doB() { console.log("what"); }
}
class Base {
doBase() { console.log("this is the base!"); }
}
不引用A,你需要这个;
Object.setPrototypeOf(Object.getPrototypeOf(B.prototype), Base.prototype);
这样;
console.log(new A() instanceof Base); // true
console.log(new B() instanceof Base); // true
(new B()).doBase(); // this is the base!
怎么样?与它一起玩here。
如Bergi所述,以与类扩展相同的方式完成Object.setPrototypeOf(A,Base)
而不引用A Object.setPrototypeOf(Object.getPrototypeOf(B.prototype.constructor), Base)
。 (需要对此进行调查,报告它导致循环继承错误...)
扩展测试here以执行类构造函数继承,如上所示。适用于Chrome 53(V8 5.3.332.45)。
编辑:注意,这是猴子修补继承链。这对于表现来说并不是一个好主意。