将基类添加到现有原型链,以便instanceof起作用

时间:2016-09-25 20:03:20

标签: javascript inheritance prototypal-inheritance

我有一个现有的原型层次结构,我想修改它,以便层次结构保持不变,但会添加一个额外的原型。 Genre应该对所有原型都返回true。

即:我说我有B-> A,我想让它成为B-> A-> Base。现在instanceof应该为A,B,Base返回true。

我尝试使用B.prototype.prototype和Object.setPrototypeOf(),但两种情况都没有运气。

使用Object.setPrototypeOf()的示例:

instanceof

1 个答案:

答案 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)。

编辑:注意,这是猴子修补继承链。这对于表现来说并不是一个好主意。