javascript - 如何修改 ES6 类的构造函数
问题描述
我正在尝试使用 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 在评论中指出的那样,您不能修改函数的代码。您必须用新的构造函数替换构造函数,没有办法绕过它。
您可以保留原型对象(它是可变的),因为这是大多数其他事物(尤其是旧实例)将引用的内容。
NewC.prototype = OldC.prototype;
NewC.prototype.constructor = NewC;
OldC = NewC;
引用了现在无法更改的旧构造函数的人无济于事。您最好的选择是根本不分发课程本身,而只是分发您的更新代码知道要修改其行为的工厂。
推荐阅读
- python - 链接单页网站时的 NoReverseMatch
- python - 如何将模型 X 与模型 X 的实例相关联?
- reactjs - 如何使用 react 和 typescript 根据条件渲染 jsx?
- python - 单击按钮时调用函数时出错-python,tkinter
- javascript - 条纹“卡片元素”未显示。为什么?
- google-apps-script - 如何通过谷歌脚本获取属于谷歌群组的成员的日历ID
- vue.js - vue3 和 vu-cli4.x 部署 nginx 404
- mongodb - 从多个数组分组并找到总和
- json - 试图将 2 个 json 文件与地图进行比较
- mongodb - 未经授权将集合导出为 excel 文件