我正在尝试使用 ES6 类进行热代码重载。我需要能够修改类的构造函数,而不需要用新的类替换该类(因为其他人可能会引用它)。
然而,我发现类对象看起来好像有一些对其最初定义的构造函数的内部引用;实例化该类new
也不抬头constructor
or prototype.constructor
在课堂上。
Example:
class OldC { constructor() { console.log("old"); } }
class NewC { constructor() { console.log("new"); } }
OldC.prototype.constructor = NewC.prototype.constructor;
OldC.constructor = NewC.constructor;
new OldC();
--->“旧”
(更新所有其他方法都可以正常工作;这只是我遇到问题的构造函数。)
认为构造函数可能是通过以下方式找到的[[prototype]]
,我还添加了这个:
Object.setPrototypeOf(OldC, Object.getPrototypeOf(NewC));
Object.setPrototypeOf(OldC.prototype, Object.getPrototypeOf(NewC.prototype));
这也没有帮助(鉴于没有发生子类化,我不会期望它会发生)。
毕竟,检查 OldC 表明原型属性完全符合我的预期,OldC.prototype.constructor
成为新人。但是,构造 OldC 的实例仍然会调用原始构造函数。
这是怎么回事?我该如何解决?
尽管如此,构建一个实例OldC
调用原始构造函数。
是的,因为OldC
本身就是构造函数。您需要覆盖OldC
变量来改变什么new OldC
does.
修改类的构造函数,而不用新的类替换该类(因为其他人可能引用它)。
正如@trincot 在评论中指出的那样,你不能修改函数的代码 https://stackoverflow.com/a/24539482/5459839。您必须用新的构造函数替换构造函数,这是没有办法解决的。
不过,您可以保留原型对象(它是可变的),因为这是大多数其他事物(尤其是旧实例)将引用的内容。
NewC.prototype = OldC.prototype;
NewC.prototype.constructor = NewC;
OldC = NewC;
对于那些引用现在无法更改的旧构造函数的人来说,这是没有帮助的。最好的选择是根本不分发类本身,而只分发一个工厂,您的更新代码知道要修改其行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)