更改构造函数原型时出现的问题

2024-02-16

我目前正在阅读 Stoyan Stefanov 的书“面向对象的 JavaScript”,我偶然发现了一个有趣的问题。这是代码:

var shape = {
    type: 'shape',
    getType: function() {
        return this.type;
    }
};

function Triangle(a, b, c) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.type = 'triangle';
}

Triangle.prototype = shape; // changing the prototype object
Triangle.prototype.getPerimeter = function() {
    return this.a + this.b + this.c;
}

var t = new Triangle(1, 2, 3);
t.constructor; // logs Object() instead of Triangle(a, b, c)

正如您所看到的,这是构造函数从原型对象继承一些属性的简单示例。但对象 t 的构造函数属性指向 Object() 对象,而不是它应该指向的 Triangle(a, b, c)。不过,如果我对原型更改进行评论,一切都会正常。我的问题是什么? (重读面向对象的 Javascript 和 JavaScript 模式中的整个原型章节,找不到答案)。 附:抱歉我的英语不好,正在努力练习。 :)


我将分两部分解释您的代码。首先,什么是constructor实际上是财产吗?其次,为什么不返回Objects在你的代码中?

The constructor财产和斯托扬的错误:

在 Stoyan Stefanov 的书第 150 页中,他指出:

原型是在定义函数后立即创建的属性。它的初始值是一个空对象。

It is wrong。根据第 9.2 节

prototype属性的初始值是一个对象具有单一财产. 该属性被命名为构造函数并返回与原型关联的构造函数。

你可以测试它Triangle.prototype.constructor。它在定义函数时就已设置。

结论1: the constructor实际上是Constructor.prototype。在你的情况下,它是Triangle.prototype.constructor.

所有实例Triangle可以通过原型链访问该属性。但这些物体本身并没有constructor财产。下面的代码证明了这一点:

function Triangle(a, b, c) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.type = 'triangle';
}
var t = new Triangle(1, 2, 3);
t.hasOwnProperty('constructor');
>>false
t.__proto__.hasOwnProperty('constructor');
>>true

结论2: 当您访问constructor实例的属性,您可以从原型链中获取它们。

为什么它没有按您的预期工作

You set Triangle.prototype to shape which doesn't包含原来的constructor财产。

因此,这一次,当你查询t.constructor,它将通过以下过程解决它:

  1. 看一下它本身的属性,发现没有constructor
  2. 继续仰望t.__proto__,即Triangle.prototype。您已将其设置为shape其中不包含constructor财产。
  3. 沿着原型链继续查找——t.__proto__.__proto__. It is Triangle.prototype.__proto__,并且它被解析为Object.prototype. Object.prototypeconstructor属性及其指的是Object.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改构造函数原型时出现的问题 的相关文章

  • 如何确定并打印 jQuery 版本?

    是否有一个 jQuery 函数可以返回当前加载的 jQuery 版本 你可以使用这个 fn jquery or if you re using noConflict jQuery fn jquery 当 jQuery 构建时它会自动更新 定
  • 获取express.js中间件请求中“#”后的url

    我需要获取服务器中间件上的 url 使用express js 我用req url但是当 url 开头时 some urlreq url 返回 与req path 有没有办法获取url之后 在express js中 No URL 中以 符号永
  • 如何在通过 .ajaxForm() 提交表单之前执行一些操作?

    我正在使用 ajaxForm 框架来发送我的数据 而无需重新加载我的页面 ReplayForm ajaxForm success function data alert Success 现在 我想在提交表单之前检查一些条件 如果条件为假 则
  • 使用 Jest 和 React JS TestUtils 测试表单

    我有一个带有 3 个单选按钮的表单 如下所示 假名
  • Eslint 从另一个文件确定全局变量

    我试图以这样的方式设置 ESLint 使其在对实际目标文件进行 linting 之前解析全局声明文件 这样我就不必将所有确实是全局的函数和变量声明为全局 而是让解析器弄清楚 In 一些 模块 js function do something
  • 使用 jQuery Select2 清除下拉菜单

    我正在尝试使用奇妙的方式以编程方式清除下拉菜单Select2 http ivaynberg github com select2 图书馆 使用 Select2 远程 ajax 调用动态填充下拉列表query option HTML
  • 如何让Gmail像加载进度条一样

    我想在页面的中心和顶部创建一个像 Gmail 一样的加载进度条 并适用于所有浏览器 这是基本代码
  • 在随机位置启动 HTML5

    我有一个大约 2 小时长的音轨 我想在我的网站上使用它 我希望它在页面加载时在随机位置开始播放曲目 使用 HTML5 可以吗 我知道您可以使用 element currentTime 函数来获取当前位置 但是如何在完全下载之前获取曲目的总时
  • 水平滚动的表格上的“粘性”标题......完全不可能?

    经过过去几个小时的研究后 我开始认为这是不可能的 即使在最新的浏览器上也是如此 HTML table具有水平滚动的元素 带有 粘性 thead在顶部 作为垂直滚动的周围网页的一部分 这是我的尝试 a height 100px backgro
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • API 使用令牌向 odoo 进行身份验证

    我想使用令牌从 Express 应用程序向 Odoo 进行身份验证 我在用odoo xmlrpc https www npmjs com package odoo xmlrpc连接 Odoo 的节点模块 我的快递应用程序 Odoo 要求 A
  • JS 保留以零结尾的小数[重复]

    这个问题在这里已经有答案了 在JavaScript中 是否可以 锁定 十进制数 以保留以零结尾的 浮点数 例如 我有 2 个不同的数字 如下所示 伪代码 let a 1 0 let b 1 00 a b true should be fal
  • 将 Firebase FCM 添加到 ReactJS 应用程序

    我正在尝试向我的 ReactJS 应用程序中的用户发送推送通知 我已添加 firebase 请求用户通知权限 这正在发挥作用 但现在我想注册设备令牌 但这给了我错误 消息传递 我们无法注册默认的 Service Worker 无法注册 Se
  • 如果没有 /// 标签,TypeScript 的“将 JavaScript 输出合并到文件中”选项无法推断出正确的脚本顺序

    我正在开发一个使用 将 JavaScript 输出合并到文件中 选项的 TypeScript 解决方案 我经常引用另一个文件中定义的项目 例如 In MyBaseClass ts export class MyBaseClass In My
  • 使用 JQuery 禁用和启用所有超链接

    我有以下禁用所有超链接的内容 但在事件发生后我想再次启用它们 我该如何执行此操作 a click function return false 我认为这不仅仅是将其设置为 true 那么简单 谢谢大家 不要以这种方式绑定 点击 处理程序 而是
  • 当我多次调用 requestAnimationFrame 时会发生什么

    我的意思是一次调用多个具有相同功能的 requestAnimationFrame function Draw DoSomething function AFunc prepare something requestAnimationFram
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • Javascript 浮点乘以 100 仍然有错误

    我有一个货币字段的文本输入 我在字段中输入 33 91 并在尝试使用 乘以 100 技术时得到以下结果 var curWth parseInt trans withdraw index val 100 3390 var curWth par
  • Service Worker 与 Shared Worker

    Service Worker 和 Shared Worker 有什么区别 我什么时候应该使用 Service Worker 而不是 Shared Worker 反之亦然 Service Worker 具有共享 Worker 之外的附加功能
  • 尝试使用 Javascript 解决对称差异

    我正在尝试找出对称的解决方案 使用 javascript 完成以下任务的差异 目标 接受未指定数量的数组作为参数 保留数组中数字的原始顺序 不删除单个数组中数字的重复项 删除数组中出现的重复项 因此 例如 如果输入是 1 1 2 6 2 3

随机推荐

  • 如何控制 Maven 中测试的执行顺序?

    我需要按顺序运行测试 我在任何地方都找不到对此进行充分记录的地方 我更喜欢从命令行执行此操作 就像是 mvn Dtest test1 test2 test3 test5 test 我该怎么做呢 您无法指定测试的运行顺序 执行此操作的解决方法
  • 泛型类中的静态方法?

    在Java中 我想要这样的东西 class Clazz
  • ServerManager CommitChanges 进行更改时略有延迟

    我对 ServerManager 类 来自 Microsoft Web Administration 程序集 有一个小问题 我希望你们中的一些人可以帮助我 基本上 我需要在站点内创建一个新应用程序 使用 IIS 7 5 并将用户重定向到同一
  • 使用 git-svn:拉取、合并还是变基?

    我一直在与 git git svn 学习曲线作斗争 昨晚 作为学习曲线的一部分 我做了一些非常非常糟糕的事情 我已经纠正了它 但我希望以我的方式理解错误 我有一个 svn 存储库 我从中克隆了主干和分支 我忽略了标签 因为我们不处理这些标签
  • tinyMCE模糊事件

    你好 当用户在tinyMCE文本区域中完成书写并单击外部某处 onBlur 时 我想做一些事情 到目前为止我已经尝试过 id topic text parent live blur function alert asd I saw id t
  • 为什么在 C++ 中我们需要使用 `int main` 而不是 `void main`? [复制]

    这个问题在这里已经有答案了 为什么我们需要使用int main并不是void main in C 简短的回答是因为 C 标准要求main 回来int 您可能知道 返回值main 运行时库使用函数作为进程的退出代码 Unix 和 Win32
  • 如何从切片中删除最后一个元素?

    我见过有人说只需通过附加旧切片来创建一个新切片 slc append slc item slc item 1 但是如果你想删除切片中的最后一个元素怎么办 如果您尝试更换i 最后一个元素 与i 1 它返回越界错误 因为没有i 1 您可以使用l
  • Keras“pickle_safe”:Python 中的“pickle 安全”或“不可 picklable”是什么意思?

    Keras fit generator 有一个参数pickle safe默认为False 如果有的话 训练可以跑得更快ispickle safe 并相应地将标志设置为True 根据Kera 的文档 https keras io models
  • JMock- java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch()

    我知道解决方案是以某种方式确保 Junit 在 hamcrest 之后加载 我有一个 intellij 项目 在其中设置了一个外部库 其中包含 JUnit 和 JMock 以及 hamcrest 我怎样才能确保这个错误不会出现 junit
  • 迭代 Numpy 矩阵行以每行应用一个函数?

    我希望能够迭代矩阵以将函数应用于每一行 我该如何为 Numpy 矩阵做到这一点 您可以使用numpy apply along axis 假设你的数组是二维的 你可以像下面这样使用它 import numpy as np myarray np
  • 零长度数组

    我正在重构一些旧代码 并发现一些包含零长度数组的结构 如下 当然 警告被 pragma 抑制 但我无法通过包含此类结构的 新 结构创建 错误 2233 数组 byData 用作指针 但为什么不使用指针呢 或者长度为1的数组 当然 没有添加任
  • Ruby class_eval 方法

    我想弄清楚如何动态创建方法 class MyClass def initialize dynamic methods arr Array new dynamic methods arr each m self class class eva
  • Kotlin 中的普通类和数据类有什么区别?

    我尝试解决任务 6 DataClass 科特林公案 https github com vicboma1 Kotlin Koans named arguments 当我在代码中使用普通类时 测试用例失败 这是我的数据类代码 data clas
  • CMakeExternalProject_Add() 和 FindPackage()

    是否有正确的方法来查找图书馆 通过FindPackage 是用ExternalProject Add 问题是 CMake 无法在 CMake 时找到该库 因为外部库是在编译时构建的 我知道在超级构建中构建库和项目时可以组合这两个 CMake
  • 为什么投票机不开源? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 嗯 这只是与编程相关 但我想今天是选举日 对吧 是否有一个很好的理由说明为什么它们不开源 不一定是开源的 因为任何人都可以做出贡献 但开源是因为
  • 我可以在 Javascript 中识别(图形输入板)笔压吗?

    有没有办法使用 javascript 来识别笔压 最好我不想使用 Flash 并尝试将其作为纯 JS 完成 编辑 好吧 我意识到 Wacom 平板电脑有可能实现这一点 因为它们附带的软件可以与其 javascript api 配合使用 从而
  • 使用 pandas 忽略来自 openpyxl 的 UserWarning

    我有大量必须加载的 xlsm 文件 每个 Excel 文件有 6 个工作表 因此 我使用 pandas 打开每个 Excel 文件 for excel file in files list with pd ExcelFile excel f
  • .Net 中字符串(或任何其他对象)的内存使用情况

    我写了这个小测试程序 using System namespace GCMemTest class Program static void Main string args System GC Collect System Diagnost
  • WordPress 预览_帖子_链接

    我试图在 WordPress 上发布时更改默认的 预览帖子 按钮 因为该网站安装了被黑客入侵的 WordPress 并且帖子预览不在应有的位置 我找到了钩子preview post link现在我只是想弄清楚如何制作一个小插件来解决这个问题
  • 更改构造函数原型时出现的问题

    我目前正在阅读 Stoyan Stefanov 的书 面向对象的 JavaScript 我偶然发现了一个有趣的问题 这是代码 var shape type shape getType function return this type fu