将基类添加到现有的原型链中,以便instanceof工作
Add base class to existing prototype chain so that instanceof works
我有一个现有的原型层次结构,我想修改它,使层次结构保持完整,但一个额外的原型被添加到它的结束。对于所有的原型,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)
。(需要对此进行调查,报告它会导致循环继承错误…)
扩展了这里的测试,以执行上面所示的类构造函数继承。
编辑:注意,这是猴子修补继承链。
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- 如何使用多个jquery版本,以便Responsive Slides.js工作
- 如何重新加载jquery,以便它能为下一个进程工作
- 如何正确创建带有“Url.Action”的查询字符串的网址,以便它在Firefox中工作
- 如何将整个页面保存为一个文件,以便它离线工作(包括外部javascript)
- 如何更改 jsFiddle 代码,以便它在 webrowser 中工作
- 如何将数据(如用户 ID)传递给 Web 工作人员,以便从服务器获取其他推送通知数据
- 开发多租户应用程序,以便用户可以在同一浏览器中使用不同的选项卡在不同的组织中工作
- 如何绑定和解除绑定无限ajax滚动,以便其他jQuery正常工作
- 更改AJAX未定义的变量,以便post可以工作
- 如何使这个选择框在Javascript中工作,以便它启用另一个选择框
- 我如何访问PHP变量,以便我可以使用javascript/ jquery的值工作
- 工作的谷歌地图API,我有它的设置,以便用户可以添加一个选择矩形到他们的屏幕.我怎么能只做一次呢
- 将基类添加到现有的原型链中,以便instanceof工作
- 替代占位符,以便在Internet explorer中工作
- SignalR集线器是否有明确的版本控制策略,以便旧的JS代码可以继续工作
- 试图将一个变量放入字符串中,以便函数导入一个键,然后在工作表中执行
- 有没有办法将多个事件添加到 $(“body”).on() 中,以便在更改列表或单击按钮时工作
- 我必须把谷歌分析代码和事件跟踪代码放在哪里,以便它们都能正确工作