为什么在 javascript 中列出类的实际构造函数很重要

2023-12-29

我正在阅读 javascript 花园http://bonsaiden.github.com/JavaScript-Garden/ http://bonsaiden.github.com/JavaScript-Garden/关于 javascript 中的原型,其示例之一如下:

function Foo() {
    this.value = 42;
}
Foo.prototype = {
    method: function() {}
};

function Bar() {}

// Set Bar's prototype to a new instance of Foo
Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';

// Make sure to list Bar as the actual constructor <-------------------
Bar.prototype.constructor = Bar;

请注意“确保将 Bar 列为实际构造函数”这一行。我真的不知道这是做什么的。我尝试过创建带有或不带有最后一行的 Bar() 的新实例。但在这些实例上调用“值”或“方法”会返回完全相同的结果。所以我想知道,指定构造函数的需要是什么(我假设必须有一个)?

谢谢你!!!


每个函数都有一个prototype属性,它是在创建函数对象时分配的,它指向一个继承自的新创建的对象Object.prototype,并且它有一个constructor属性,它只是指向函数本身。

目的prototypeproperty 是提供一种使用构造函数来实现继承的方法。当您使用以下命令调用函数时new运算符,它将创建一个继承自该构造函数的新对象prototype.

现在,该计划的目的是constructor属性就是有一种方法可以引用创建对象的构造函数,例如:

function Foo () {}
// default value of the property:
Foo.prototype.constructor == Foo; // true

该属性由“实例”继承Foo,这样你就可以知道使用哪个构造函数来创建对象:

var foo = new Foo();
foo.constructor == Foo;

如果将一个新对象分配给函数的原型,则这种关系就会丢失:

function Bar () {}
Bar.prototype = { inherited: 1 };

Bar.prototype.constructor == Bar;    // false
Bar.prototype.constructor == Object; // true

它也会影响函数的实例:

var bar = new Bar();
bar.constructor == Bar;    // false
bar.constructor == Object; // true

另一种类似的情况是,当使用构造函数有两级或更多级别的继承时,最常见的方式是用来表示函数之间的继承关系,即分配prototype第二层的属性,例如:

function Parent() {}

function Child () {}
Child.prototype = new Parent();

上面的代码有几个问题,首先,它执行了父构造函数的逻辑来创建继承关系,但那是另一个故事了,在上面的例子中constructor属性也会受到影响,因为我们完全替换了Child.prototype object:

var child = new Child();
child.constructor == Parent; // true

如果我们替换替换的值constructor的财产Child.prototype分配它后,它将显示预期的行为:

function Child() {}
Child.prototype = new Parent();
Child.prototype.constructor = Child;

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

为什么在 javascript 中列出类的实际构造函数很重要 的相关文章

随机推荐

  • 默认声音在 Android v9 中不播放,但在 Android v7 上运行 - ionic v3 cordova 推送插件

    I am using FCM to send notification on my app below are the screenshots how I am doing As you can see I enabled the soun
  • 将字节数组转换为双精度数的问题

    我在使用以下方法将字节数组转换为双精度数组时遇到问题BitConverter ToDouble 简而言之 我的程序将选择一个图像 然后将图像转换为字节数组 然后它将把字节数组转换为双精度数组 问题是 当我将字节数组转换为双精度数组时 我会在
  • 如果两个阶段使用相同的 RDD,spark 是否会读取同一个文件两次?

    在 Spark 中 如下代码 rdd sc textfile file path rdd1 rdd filter filter1 maptopair rdd2 rdd filter filter2 maptopair rdd3 rdd1 j
  • Android ProgressDialog 的样式

    我正在尝试定制ProgressDialog风格有类似的东西 我拥有的 我知道如何更改微调器的样式和颜色 但我不明白的是 如何制作圆角 我正在尝试使用android radius属性 但是没有任何变化 而且不知道如何减少padding 也许我
  • ASP.NET-MVC 2 数据注释字符串长度

    我可以使用 MVC 2 DataAnnotations 指定字符串字段的最小长度吗 有没有人这样做过或者他们创建了自定义属性 如果是的话 您介意分享源吗 如果您使用的是 asp net 4 0 则可以使用 StringLength 属性来指
  • 获取页面上选定的文本和选定的节点?

    当选择文本块 可能跨越许多 DOM 节点 时 是否可以使用 Javascript 提取所选文本和节点 想象一下这个 HTML 代码 h1 Hello World h1 p Hi b there b p 如果用户从 World 开始启动 mo
  • 在 IIS 10 中注册 asp.net

    我有一个与在 IIS 10 中注册 asp net 有关的问题 我的环境是Windows 10 IIS 10 安装了VS 2013和VS 2015 NET 3 5是Windows功能中的一个功能 我想在iis中使用nettcpbinding
  • Spring Security OAuth2 登录重定向到错误页面,尽管成功

    为了不泄露机密信息 提供商将被替换为 PROVIDER 授权有效 但它没有将我重定向到索引 而是将我重定向到 error 重现步骤 启动应用程序 进入任何页面 它会将我重定向到http localhost oauth login显示一个链接
  • 如何为每个箱线图设置不同的颜色

    我正在尝试在 VSCode 中制作 Seaborn 箱线图 我的代码基于这里的示例 here https github com bvalgard Boxplots blob master Boxplots ipynb 我专门制作了类似倒数第
  • Tkinter 帮助查看器

    我有一个简单的 Python Tkinter 应用程序 我想向其中添加帮助文档 将帮助查看器集成到应用程序的最简单方法是什么 最好是跨平台的 尽管我主要使用 Windows 我可以想象用纯 HTML 编写帮助 或者只是启动外部网络浏览器 使
  • 密码保护 Android 应用程序的启动

    我正在寻找一种在启动时用密码保护我的 Android 应用程序的方法 即当启动 恢复属于我的 apk 包的活动时 将显示密码对话框 我已经尝试了一些方法 扩展应用类 http developer android com reference
  • 在Excel中,使用VBA,如何获取“路径+文件名+扩展名”并更改扩展名?

    有一个动态生成 Excel 文件和 csv 的程序 excel 文件具有 加载时 加载 csv 数据的 VBA 代码 我想通过让 csv 文件具有相同的文件名但扩展名不同来动态调用该 csv 因此 根据我的理解 如果 xls 文件在这里 C
  • MS Access 直通查询到 SQL Server 需要什么字符清理

    我正在尝试将 MS Access 与 SQL Server 连接 并且我想确保我不会受到 SQL 注入攻击 我看到过使用 ADO 创建查询的参数化版本的建议 但我想了解如何通过 DAO 传递来清理我的输入 目前我正在转义单引号和反斜杠 VB
  • 在 Github 上分叉 Pull 请求

    有效分叉 Pull 请求的正确工作流程是什么 为了解释用例 我找到了一个存储库 其中包含一个添加了我需要的功能的拉取请求 不幸的是 拉取请求作者已经擅离职守 并且存储库所有者在编写测试之前不会接受拉取请求 我想 分叉 拉取请求并编写测试 以
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • Windows 上具有大型数组的 Python 多处理

    我使用python的多处理模块在linux平台上编写了一个脚本 当我尝试在 Windows 上运行该程序时 它不能直接工作 我发现这与 Windows 上如何生成子进程有关 所使用的物品是否可以腌制似乎至关重要 我的主要问题是 我正在使用大
  • 通过 CLI 的 AWS DynamoDB put-item 类型无效(unicode v. dict)

    我想通过命令行向我的 DynamoDB 表添加一个项目 但遇到了类型错误 我尝试添加的数据非常简单 id 1 我运行的命令同样简单 aws dynamodb put item table name my table item id 1 我收
  • required_if Laravel 5 验证

    我有用户可以填写的表格来出售他们的房屋 对于其中一项输入 用户必须选择 出售 或 出租 如果是出售 则会出现两个价格输入字段 如果是出租 则会出现基于 jQuery 的其他价格输入字段 我的问题是我希望价格字段是必需的 但是例如 如果我选择
  • 通过 SOS 调查 CLR

    目前 我正在深入研究 CLR 并尝试找到托管对象的适当大小 我有两种简单的类型 XClass class XClass public XStruct StructField new XStruct public int IntField p
  • 为什么在 javascript 中列出类的实际构造函数很重要

    我正在阅读 javascript 花园http bonsaiden github com JavaScript Garden http bonsaiden github com JavaScript Garden 关于 javascript