如何修改ES6类的构造函数

2024-01-09

我正在尝试使用 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(使用前将#替换为@)

如何修改ES6类的构造函数 的相关文章

随机推荐

  • 如何使用 String.format 将字符串居中?

    public class Divers public static void main String args String format 1 10s 2 10s 3 20s n System out format format First
  • 谷歌地图 v3 热图在页面加载时不显示

    我有一个映射页面 它检索 json 响应并创建相关的点数组来加载热图 所有这些都在所需的初始化查询中 该查询在 jquery document ready 中调用 但奇怪的是 所有外部数据都返回正常并且填充正常 点数组也正常 但是 当我在热
  • Linux 上的 MS SQL Server 通过 PHP 提供非模拟预准备语句支持

    Summary 我正在尝试使用准备好的语句来停止 SQL 注入 但无法找到保证其正常工作所需的支持 Scenario 我在 Linux 上托管一个站点 该站点使用 FreeTDS 版本 0 91 连接到 Microsoft SQL Serv
  • 我什么时候真正需要在 Inno Setup 中使用 ScaleX 和 ScaleY 函数?

    这是文档ScaleX功能 ScaleX https jrsoftware org ishelp topic isxfunc scalex htm 同样的事情是为了ScaleY ScaleY https jrsoftware org ishe
  • Redis 连接池 + Node.js

    Node js 异步 I O 是否需要 Redis 连接池 我看到的大多数 Redis 库都允许您创建客户端连接 但连接池模块并不多 因此我认为它并不那么重要 让我困惑的一件事是 Redis 在一个 Redis 实例中默认有 16 个不同
  • 如何使用 PHP 将 .pdf 文件作为 BLOB 存储到 MySQL 中?

    如何从 PHP 将 pdf 文件作为 BLOB 存储到 MySQL 中 编辑添加 以下代码已过时 无法在 PHP 7 中运行 有关更多详细信息 请参阅答案底部的注释 假设一个由整数 ID 和 blob DATA 列组成的表结构 并假设 My
  • 适用于 x64 的 SQLite3.dll

    从下载sqlite org 下载 https www sqlite org download html 他们提供适用于 Windows 的预编译二进制文件适用于 x86 和 x64 所以 下载的是 def文件和一个 dll文件 使用这两个文
  • 单击侦听器上的通知 RemoteView

    所以 经过一番绞尽脑汁之后 我已经无计可施了 我有一个媒体播放器RemoteViews在我的通知中 我希望能够访问播放 暂停 上一个和下一个按钮 我知道setOnClickPendingIntent 将用于通过通知进行通信 然而 我想知道这
  • 如何从 NSString 中提取/拆分数字和字符串

    我有一个 NSString text randomtext12345 文本字符串始终以 string 未知长度 开头 后跟 number 整数类型 文本之间没有 分隔符 如何检测哪个是字符串还是整数 为了提取 分离 分离出文本成为 NSSt
  • 空节点的非法自关闭节点表示法 - 使用 PHP DOMDocument 输出 XHTML

    我正在 PHP 中使用 XPATH 处理符合 XML 的 XHTML 输入 如下所示 xml new DOMDocument xml gt loadXML utf8 encode temp temp utf8 decode xml gt s
  • 执行到 pod 的 kubernetes RBAC 角色动词

    我的 1 9 集群为开发用户创建了这个部署角色 部署按预期进行 现在我想向开发人员授予执行和日志访问权限 我需要为 pod 添加什么角色 kind Role name deployment manager rules apiGroups e
  • Python del 语句

    Calling delPython 中的变量 这是立即释放分配的内存还是仍在等待垃圾收集器收集 就像在java中一样 显式调用del对何时释放内存没有影响 del 语句不回收内存 它删除引用 从而减少该值的引用计数 如果计数为零 则可以回收
  • 如何在 SonarQube Scanner for Jenkins 中设置 sonar.projectBaseDir?

    我尝试分析 Jenkins 中多模块项目的一个模块SonarQube 扫描仪 https plugins jenkins io sonar插件 2 5 版 不幸的是 Jenkins 选择了错误的模块作为工作目录 在这种特殊情况下 我可以更改
  • 如何测试用户是否选择了要上传的文件?

    在页面上 我有 if empty FILES logo name dossier upload fichier basename FILES logo name taille maxi 100000 taille filesize FILE
  • android.database.sqlite.SQLiteException:没有这样的列

    当我执行此查询时 我得到 android database sqlite SQLiteException 没有这样的列 错误是什么 public Cursor Getupdate String rid throws SQLException
  • JAVA getConstructor 抛出 NoSuchMethodException

    我是JAVA新手 我正在努力学习反射 http tutorials jenkov com java reflection index html 我想获得特定的构造函数 选择示例表单here http tutorials jenkov com
  • 在向上滚动和向下滚动时向菜单添加底部框阴影

    我有一个具有以下 CSS 属性的菜单 header width 100 position fixed z index 9000 overflow auto 因此 根据上面的 CSS 属性 该元素 header 显然无论滚动如何都会保持在顶部
  • 使用 Swift if let 和逻辑 AND 运算符 &&

    我们知道我们可以使用if let语句作为速记来检查可选的 nil 然后展开 但是 我想使用逻辑 AND 运算符将其与另一个表达式结合起来 因此 例如 在这里我进行可选的链接来展开并可选地将我的 rootViewController 向下转换
  • Mixin 与继承

    mixin 和继承有什么区别 mixin 通常与多重继承一起使用 所以 从这个意义上说 没有区别 细节是 mixin 很少作为独立对象有用 例如 假设您有一个名为 ColorAndDimension 的 mixin 它添加了颜色属性以及宽度
  • 如何修改ES6类的构造函数

    我正在尝试使用 ES6 类进行热代码重载 我需要能够修改类的构造函数 而不需要用新的类替换该类 因为其他人可能会引用它 然而 我发现类对象看起来好像有一些对其最初定义的构造函数的内部引用 实例化该类new也不抬头constructor or