gpt4 book ai didi

javascript - 将基类添加到现有原型(prototype)链,以便 instanceof 工作

转载 作者:行者123 更新时间:2023-11-29 21:15:12 24 4
gpt4 key购买 nike

我有一个现有的原型(prototype)层次结构,我想修改它以便层次结构保持完整,但在它的末尾添加一个额外的原型(prototype)。 instanceof 应该为所有原型(prototype)返回 true。

即:假设我有 B->A,我想将其设为 B->A->Base。现在 instanceof 应该为 A、B、Base 返回 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!

怎么样?一起玩吧 here .

如 Bergi 所述,要以与类扩展相同的方式完成 Object.setPrototypeOf(A,Base) 而无需引用 A,Object.setPrototypeOf(Object.getPrototypeOf(B.prototype .constructor), 基础). (需要调查这个,报告它导致循环继承错误......)

扩展测试here执行类构造函数继承,如上所示。适用于 Chrome 53 (V8 5.3.332.45)。

编辑:注意,这是猴子修补继承链。对于性能而言,这不是一个绝妙的主意。

关于javascript - 将基类添加到现有原型(prototype)链,以便 instanceof 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39691276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com