替换 Javascript 构造函数的 .prototype 而不是添加它是否存在问题?

2023-12-28

我遇到过另一个开发人员的代码,它执行类似的操作来定义 Javascript 类型:

function Ninja() {}
Ninja.prototype = {
  swingSword: function(){
    return true;
  }
}

当更传统的方式是这样的:

function Ninja() {}
Ninja.prototype.swingSword = function() {
    return true;
}

第一种形式主要有效,因为您可以创建一个新实例并调用swingSword方法,以及instanceof是准确的:

var ninja = new Ninja();
ninja.swingSword(); // returns true
ninja instanceof Ninja; // also true

然而,ninja.constructor指着Object而不是Ninja功能。这对我来说是一个问题:我试图通过实例访问构造函数,作为构造函数不以任何其他方式公开的解决方法。但除了访问constructor反射/解决方法黑客的属性,第一种形式是否会导致任何重大问题?

原版还有其他重要属性吗?Ninja.prototype哪个可能被隐藏?第一种形式会导致继承类型或公共库出现任何问题吗?

我试图弄清楚这是否是一个不寻常但可以接受的 Javascript 模式,或者实际上是一个常见的 Javascript 失误或“陷阱”,应该被视为一个错误。

Note my Ninja示例基于一些示例代码 http://ejohn.org/apps/learn/#65来自 John Resig 的教程。有问题的实际类型没有被调用Ninja,并且更长且更复杂。

另外,我读过this http://zeekat.nl/articles/constructors-considered-mildly-confusing.html#sec-8-1构造函数和原型指南并理解,例如如何在属性查找和why isinstanceof仍然有效。


当您从另一个原型“继承”时,您通常会替换整个原型,如果构造函数很重要,您可以将其重新设置为“正确”值:

var Child = function(){};
//"inherit" from Parent
Child.prototype=Object.create(Parent.prototype);
//reset the constructor
Child.prototype.constructor = Child;

因此,在您的情况下,只需在设置原型后修复构造函数:

var Ninja = function() {}
Ninja.prototype = {
  swingSword: function(){
    return true;
  }
};
// you can put the next line anywhere you want to fix the problem
// http://stackoverflow.com/a/16063711/1641941 under this.constructor
Ninja.prototype.constructor=Ninja;

Or:

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

替换 Javascript 构造函数的 .prototype 而不是添加它是否存在问题? 的相关文章

  • 我如何在 AngularJS 中监听点击并按住的情况?

    我制作了一个时间计数器 您可以通过单击按钮来增加或减少时间 然而 我希望当我单击并按住按钮时 时间的价值会不断攀升 所以目前如果你看到我的Plunkr http plnkr co edit BxX9x5zYFMXVqt5JsN1F p pr
  • 取消html5浏览器中的单图请求

    我正在动态加载 大 图像以绘制到 html5 画布中 如下所示 var t new Image t onload t src http myurl 但每隔一段时间就会想取消图片请求完全地 我想出的唯一方法是设置src to i e t sr
  • 如何使用 selenium 和 Mocha 获取 xPath() 选择的锚标记的文本

    我已经成功选择了 a 标签 我想显示锚标记的文本 但无法这样做 我正在使用 selenium mocha javascript 和 phantomJS 这是我的脚本 详细 var assert require assert var test
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • 如何按照编写的顺序迭代 javascript 对象属性

    我发现了代码中的一个错误 我希望通过最少的重构工作来解决该错误 此错误发生在 Chrome 和 Opera 浏览器中 问题 var obj 23 AA 12 BB iterating through obj s properties for
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • JavaScript 中数组的 HTML 数据列表值

    我有一个简单的程序 它必须从服务器上的文本文件中获取值 然后将数据列表填充为输入文本字段中的选择 为此 我想要采取的第一步是我想知道如何动态地将 JavaScript 数组用作数据列表选项 我的代码是
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • IE11不监听MSFullscreenChange事件

    我正在尝试使用 Bigscreen js 在 IE11 中使用全屏 但 IE11 不监听 MS FullscreenChange 事件 document addEventListener MSFullscreenChange functio
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • Jquery - 通过在字符串中构建 id 的 id 获取元素

    我在使用 jquery 元素时遇到问题 我正在 var 中构造名称 例如 var myId myGotId myId attr title changed myId 返回空 我想通过 id 获取我的元素 但动态构建我的 Id 连接字符串 编
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react

随机推荐

  • Guid.NewGuid() 的 C++ 版本是什么?

    我需要创建一个GUID在非托管 Windows C 项目中 我习惯了 C 我会用Guid NewGuid 非托管 Windows C 版本是什么 I think CoCreateGuid http msdn microsoft com en
  • Android WebView:在Android客户端上传图像。无法在服务器端 JavaScript 中获取文件类型

    我已经测试了 stackOverFlow 上的所有可用代码 但仍然无法正常工作 我使用Android 4 4 4并使用WebView将图像上传到服务器网页 但无法在服务器JavaScript代码中获取文件类型 alert type inpu
  • 如何将字符串转换为布尔值

    我有一个string可以是 0 或 1 并且保证不会是其他任何东西 所以问题是 将其转换为最佳 最简单和最优雅的方法是什么 bool 确实很简单 bool b str 1
  • 使用 HTTP 上传文件。收到错误:- HttpSendReuest 12005

    我想使用 HTTP 将 D er txt 上传到网络服务器 当我运行程序时 我收到 HttpSendRequest 12005 错误 我在我的网络服务器上使用了一个 PHP 脚本 它将接受该文件并将其存储在名为 upload 的预制目录中
  • 持久“记住我”Cookie 的竞争条件

    根据持久登录 Cookie 最佳实践 http fishbowl pastiche org 2004 01 19 persistent login cookie best practice 您不应该允许多次使用 记住我 令牌 持久性 coo
  • 由于未知表而无法删除表(错误 1051)

    我正在尝试从我继承的架构中删除一个表 当我SHOW TABLES I get Tables in schema a table 1 table 2 table 3 table 4 table 5 table 6 但是当我执行时
  • 领域 + NSTableView + NSArrayController

    我的 macOS 应用程序有一些问题 希望您能帮助我 我对 macOS 还很陌生 所以请多多关照 应用程序的一部分由一个简单的 NSTableView 组成 其内容绑定到 NSArrayController NSArrayControlle
  • Apache poi:删除 XWPFDocument 中的图片

    我正在编写一个应用程序 它采用带有一堆空段落和表格的 docx 文件 并使用 Apache POI 和数据库中的数据以编程方式填充它们 我提供的 docx 模型中还包含一系列图片 我的问题是我想删除不需要的图片 再次以编程方式 我看到有一种
  • TextMate 语法——规则的优先级

    我正在尝试修改 CSharp 语言的语法突出显示 因此我将在 C 字符串中获得 SQL 的语法突出显示 TextMate 支持嵌入语言 因此这似乎是可能的 我建立在csharp tmLanguage json https github co
  • 在 git 中交换暂存和未暂存更改的最短方法是什么?

    如果有一些更改添加到索引中 而有一些更改未添加到索引中 我如何交换这两组更改 它认为这对于临时提交来说是最容易做到的 当您有暂存和未暂存的提交时 在尝试对更改重新排序时可能会发生冲突 对分阶段的更改进行提交 创建一个分支供以后使用 git
  • 如何在 OpenAPI / Swagger 中递归引用封闭类型定义?

    我正在 Swagger 编辑器中编写 OpenAPI 定义 我的类型定义之一包含一个数组 其中包含与父元素类型相同的子元素 IE 像这样的东西 definitions TreeNode type object properties name
  • Centos 7 / Apache / PHP - mkdir():权限被拒绝

    在你大喊重复之前 并将我放逐至深渊 听我说完 我一直在为我工作的公司开发一个内联网站点 最初我是直接从运行的工作站上开发它Windows 7 IIS 当我接近完成网站 应用程序时 我得到了Centos 7正在运行的盒子Apache 所以我已
  • 定期刷新网页

    我的要求是我有一个 php 页面 必须根据数据库中的数据显示一些图形 数据 我想自动并定期刷新页面 以便可以更新图形 数据 因为数据仅在加载页面时获取 我怎样才能做到这一点 也许你可以尝试 setTimeout javascript 方法
  • 使用正则表达式查找字符串中的确切字符

    我有像下面这样的字符串 M10 end start M11 M1 M1 start M n1 end M1 我想要实现的目标是仅获得 M1 使用正则表达式 这是我当前的代码 Regex r new Regex M1 M1 输出如下所示 缺少
  • 在 scala 项目上 - 运行 sbt test 命令时出现错误 GC 开销限制超出

    我是 Scala 编程新手并正在学习GC overhead limit exceeded我执行时出错sbt test大型 scala 项目之一中的命令 有人知道我该如何解决这个问题吗 我得到了朋友的帮助 通过使用 mem 选项执行来增加内存
  • 用于检查属性不包含两个值的 CSS 选择器

    我有一个非常奇怪的 CSS 问题想要解决 我正在寻找任何 html 元素not have display none 以其任何有效形式 内联在style属性 一些例子
  • 如何访问 GTK/Gnome 上的主题字体和颜色

    假设我想编写一个特殊的文本编辑器小部件 我如何获得文本的默认主题颜色 选定的文本和背景 这是用户默认的 字体 我看到 GNOME 确实定义了 5 种特殊的系统字体和默认大小 为此 在 GNOME 外观配置对话框中 但我在 GTK 文档中没有
  • 如何在私有子网上运行Dataflow python?

    Apache Beam 2 1 0 添加了对在私有子网上的 Dataflow 运行器上提交作业且无需公共 IP 的支持 这是我们需要满足防火墙规则的 我打算使用squid代理来访问apt get pip等安装python依赖项 代理实例已经
  • 需要动态转换派生类:寻找替代方法

    我以这种简单的形式提出我的问题 class animal public animal name animal virtual void makenoise cout lt lt name lt
  • 替换 Javascript 构造函数的 .prototype 而不是添加它是否存在问题?

    我遇到过另一个开发人员的代码 它执行类似的操作来定义 Javascript 类型 function Ninja Ninja prototype swingSword function return true 当更传统的方式是这样的 func