如何修改ES6类的构造函数

问题描述 投票:2回答:1

我正在尝试使用ES6类重新加载热代码。我需要能够修改类的构造函数,而不用新的类替换类(因为其他人可能会引用它)。

但是,我发现它看起来好像类对象有一些内部引用它最初定义的构造函数;使用new实例化类不会在类上查找constructorprototype.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的实例仍然会调用原始构造函数。

发生了什么,我该如何解决?

javascript ecmascript-6 es6-class
1个回答
1
投票

尽管如此,构造OldC的实例会调用原始构造函数。

是的,因为OldC本身就是构造函数。你需要覆盖OldC变量来改变new OldC的作用。

修改类的构造函数,而不用新的类替换类(因为其他人可能有对它的引用)。

正如@trincot在评论中指出的那样,you cannot modify the code of a function。你必须用一个新的构造函数替换它,没有办法解决它。

你可以保留原型对象(这是可变的),因为这是大多数其他东西(特别是旧实例)将引用的。

NewC.prototype = OldC.prototype;
NewC.prototype.constructor = NewC;
OldC = NewC;

参与现在无法更改的旧构造函数的人无法获得帮助。你最好的选择不是分发本身,而只是你的更新代码知道要修改的工厂。

© www.soinside.com 2019 - 2024. All rights reserved.