我正在尝试使用ES6类重新加载热代码。我需要能够修改类的构造函数,而不用新的类替换类(因为其他人可能会引用它)。
但是,我发现它看起来好像类对象有一些内部引用它最初定义的构造函数;使用new
实例化类不会在类上查找constructor
或prototype.constructor
。
例:
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
的作用。
修改类的构造函数,而不用新的类替换类(因为其他人可能有对它的引用)。
正如@trincot在评论中指出的那样,you cannot modify the code of a function。你必须用一个新的构造函数替换它,没有办法解决它。
你可以保留原型对象(这是可变的),因为这是大多数其他东西(特别是旧实例)将引用的。
NewC.prototype = OldC.prototype;
NewC.prototype.constructor = NewC;
OldC = NewC;
参与现在无法更改的旧构造函数的人无法获得帮助。你最好的选择不是分发本身,而只是你的更新代码知道要修改的工厂。