将基类添加到现有的原型链中,以便instanceof工作

Add base class to existing prototype chain so that instanceof works

本文关键字:以便 工作 instanceof 原型 添加 基类      更新时间:2023-09-26

我有一个现有的原型层次结构,我想修改它,使层次结构保持完整,但一个额外的原型被添加到它的结束。对于所有的原型,instanceof应该返回true。

。假设我有B->A,我想让它是B->A->基底。现在,对于A, B, Base, instanceof应该返回true。

我尝试使用B.prototype.prototype和Object.setPrototypeOf(),但没有运气在任何情况下。

Object.setPrototypeOf()的示例:

class A {                                                                                                                                                                                                                            
    do() { console.log("do A"); }                                                                                                                                                                                                                            
}                                                                                                                                                                                                                                    

class B extends A {
    do() { console.log("do B"); }
    doB() { console.log("what"); }
}

var a = new A();
var b = new B();
a.do();
b.do();
b.doB();
console.log(a instanceof A)  // true
console.log(a instanceof B)  // false
console.log(b instanceof A)  // true
console.log(b instanceof B)  // true

class Base {
    doBase() { console.log("this is the base!"); }
}

// now add Base to B's chain, so that B -> A -> Base
// TODO: doesn't work!
Object.setPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(B)), Base.prototype)
//Object.setPrototypeOf(Object.getPrototypeOf(B), Base)

console.log(Object.getPrototypeOf(B))
console.log(Object.getPrototypeOf(Object.getPrototypeOf(B)))

var c = new B();
console.log(c instanceof B)    // true
console.log(c instanceof A)    // true
console.log(c instanceof Base) // false (!!! how to fix it?)
c.doBase();                    // crash, not a function

显示了从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!

这是怎么回事?在这里玩一下。

如Bergi所述,在不引用A、Object.setPrototypeOf(Object.getPrototypeOf(B.prototype.constructor), Base)的情况下,以与类扩展相同的方式完成Object.setPrototypeOf(A,Base)。(需要对此进行调查,报告它会导致循环继承错误…)

扩展了这里的测试,以执行上面所示的类构造函数继承。

编辑:注意,这是猴子修补继承链。

相关文章: