在 Javascript 中获取派生构造函数的名称

2024-01-30

在下面的示例中是否可以获取派生“类”的名称?我想以某种方式让输出为“ChildClass”,但它是“ParentClass”。

function ParentClass() { this.name = 'Bob' }
function ChildClass() { this.name = 'Fred' }
ChildClass.prototype = Object.create(ParentClass.prototype);

var child_instance = new ChildClass()
console.log('ChildClass type:', child_instance.constructor.name)

我意识到我能做到this.my_type = 'ChildClass'在 ChildClass 构造函数中,但我有许多扩展 ParentClass 的类,并且在任何地方执行此操作会很不方便。


您的情况的问题是您正在覆盖prototype的财产ChildClass但你没有重置constructor新原型上的属性。您需要添加一行:

function ParentClass() {
    this.name = "Bob";
}

function ChildClass() {
    this.name = "Fred";
}

ChildClass.prototype = Object.create(ParentClass.prototype);

ChildClass.prototype.constructor = ChildClass; // add this line to your code

现在您的代码将按预期工作。以下答案解释了为什么您的原始代码不起作用:https://stackoverflow.com/a/8096017/783743 https://stackoverflow.com/a/8096017/783743

就我个人而言,我不喜欢像这样编写“类”,其中构造函数和原型分别悬空。打字太乏味、语无伦次、眼睛疼痛并且难以维护。因此,我使用以下实用函数来创建类:

function defclass(base, body) {
    var uber = base.prototype;
    var prototype = Object.create(uber);
    var constructor = (body.call(prototype, uber), prototype.constructor);
    constructor.prototype = prototype;
    return constructor;
}

现在您可以按如下方式创建类:

var ParentClass = defclass(Object, function () {
    this.constructor = function () {
        this.name = "Bob";
    };
});

var ChildClass = defclass(ParentClass, function () {
    this.constructor = function () {
        this.name = "Fred";
    };
});

这种方法有几个优点:

  1. 继承和类定义已合二为一。
  2. 构造函数只是另一个原型方法。
  3. 一切都很好地封装在一个闭包中。
  4. 调用基类原型方法很容易。
  5. 您可以轻松创建私有静态函数。

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Javascript 中获取派生构造函数的名称 的相关文章

随机推荐

  • “is”运算符对浮点数的行为异常

    在对模块进行单元测试时 我遇到了一个令人困惑的问题 该模块实际上正在转换值 我想比较这些值 相比之下还是有区别的 and is 部分地 我很注意其中的差异 gt gt gt 0 0 is 0 0 True as expected gt gt
  • 可扩展的TableView [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何按类别显示表格视图 并且单击一行
  • Symfony3 - 实体不适用于关系(具有索引和约束的数据库)

    现在主演了几个小时 也许我错过了一些明显的事情 具有此数据库结构 带有索引和约束 CREATE TABLE exploit id bigint 20 NOT NULL AUTO INCREMENT edb id varchar 100 CO
  • 意外的''回应宁静的服务

    我正在尝试学习宁静的服务 作为其中的一部分 我正在设计一个示例请求和响应页面 看看我一切都正确 除了以下内容 资源名为 i package com tutorialspoint import java io BufferedReader i
  • 如何忽略javafx中的60fps限制?

    我需要创建一个 100fps 动画来显示每秒包含 100 帧的文件中的 3D 数据 但是javaFx中的AnimationTimer只允许我获得60fps 如何克服它 删除 JavaFX 帧速率上限 您可以通过设置系统属性来删除 60fps
  • 在两级子例程中传递假定形状数组 (Fortran 90)

    我在 Fortran 90 中使用假定形状数组调用连续子例程时遇到问题 更具体地说 我调用两级子例程 传递假定形状数组作为参数 但最终数组丢失了 为了演示它 可以按照下面的代码进行操作 program main INTERFACE subr
  • 如何从FTP读取文件而不下载它们? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在我的索引文件程序代码中 我需要访问 FTP 文件并读取所有文件而不下载它们 我如何使用 org apache commons net
  • 当 Android 使用嵌套片段和 getSupportFragmentManager() 在方向更改时重新创建我的应用程序时,到底会发生什么?

    我查看了与此问题相关的其他线程 它们似乎都使用 getChildFragmentManager 但如果可能的话 我想使用 getSupportFragmentManager 问题是这样的 我有父片段 A 它包含子片段 B B 是一个选择器片
  • 在两个不同宽度的弹性项目之间水平居中弹性项目[重复]

    这个问题在这里已经有答案了 假设我有 3 个 div 水平显示flexbox div1 center div wider div 我希望中心 div 与父级的中间对齐 我怎样才能做到这一点 justify content将根据所有宽度的总和
  • React 服务器渲染 --> 用新的根组件替换 React 渲染的子组件

    我正在尝试同构渲染反应 它会渲染 但我在客户端中收到警告 错误 我使用 jspm 和 npm 作为包管理器 warning js 25 Warning render Replacing React rendered children wit
  • Kruskal - R 数据子集的 Wallis p 值矩阵

    考虑一个数据集Data它有几个因子和几个数值连续变量 其中一些变量 比方说slice by 1 有 男性 女性 类别 和slice by 2 具有 悲伤 中性 快乐 类 用于将数据 切片 为子集 对于每个子集 Kruskal Wallis
  • Git Stash 上的 Git PathSpec 问题

    当我运行新版本时2 13 0 windows 1其新命令stash p pathspec as git stash p AB Dir1 Dir2 DestinationHierarchyCreator cs 它报告错误 错误 路径规范 AB
  • 使用 Int64 进行位移位

    Int64 变量需要移位 我正在从数据库文件解析伪数学函数 变量是 uint32 或 int32 所以我确实将它们放入 Int64 中以平等地处理它们 而不会丢失任何内容 在我的一个树节点中 我需要对 Int64 进行位移位 不幸的是 移位
  • Python,用PIL画一个圆

    我正在寻找一个命令 可以使用 PIL 在现有图像上绘制一个圆圈 im Image open path 我想要一个可以绘制半径为彩色的圆圈的函数r和中心 x y image Image open x png draw ImageDraw Dr
  • 如何对非常大的 CSV 文件进行排序?

    我有一个 294 000 行的大型 csv 其中第 1 列中包含 url 第 2 列中包含数字 我需要将它们从最小数到最大数排序 我已将其加载到 CSVed 软件中 它可以正常处理 不会崩溃或发生任何问题 但是当我单击列顶部对其进行排序时
  • 如何为 google colab 创建视频设备?

    我试图在 google collab 上使用 pygame 创建一个简单的游戏 但在执行代码 pygame display set mode 时 我收到错误 没有可用的视频设备 那么我该如何解决呢 您可以通过告诉 SDL 使用虚拟驱动程序来
  • 脚本在 PyCharm 中运行,但不是从命令行运行

    当我尝试从 PyCharm IDE 运行我的程序时 一切正常 但如果我输入 Fedora python myScript py 在 shell 提示符中 我从模块 1 中收到导入错误 ImportError No modue named m
  • 使用 Spring MVC 的 ResponseEntity 返回流

    我有一个 Spring MVC 方法 它返回一个ResponseEntity 根据检索到的具体数据 有时需要返回一个数据流给用户 有时它会返回流以外的其他内容 有时还会返回重定向 我绝对希望这是一个流而不是字节数组 因为它可能很大 目前 我
  • 如何在设备上部署aab文件?

    在我的 Android 应用程序中 如果我想更新 APK 文件 我会使用以下命令 adb install r some my apk 好的 是工作 现在我签署了我的捆绑包 结果是 Android Studio 3 5 产生 AAB Andr
  • 在 Javascript 中获取派生构造函数的名称

    在下面的示例中是否可以获取派生 类 的名称 我想以某种方式让输出为 ChildClass 但它是 ParentClass function ParentClass this name Bob function ChildClass this