Javascript:何时在构造函数内定义函数以及何时使用原型?

2023-11-21

我注意到在各种教程中向“类”添加函数的不同方法。第一个是在类的构造函数中:

Class = function () {
    this.doSomething = function() {...};
}

另一种是:

Class = function () {}
Class.prototype.doSomething  = function() {...};

在什么情况下应该使用其中一种而不是另一种?

我的理解是没有protectedJavascript 中的属性或方法正确吗?如果是的话,应该用什么来代替?


当您在构造函数中定义函数时this.myFunction=...,它特定于您的实例。这意味着它必须为所有实例构建并保存在内存中,这可能会很重。也是不能遗传的。

这样做的唯一正当理由是:

  • 包含特定值
  • 其他类型的特定函数(您可能每次都会构建不同的函数)

大多数情况下,您真正​​需要的是原型上定义的函数。

来自MDN 上的对象 :

JavaScript 中的所有对象都是 Object 的后代;所有对象 从 Object.prototype 继承方法和属性,尽管它们 可能会被覆盖。例如其他构造函数的原型 重写构造函数属性并提供自己的 toString 方法。对对象原型对象的更改会传播到所有对象 对象,除非受这些更改影响的属性和方法是 沿着原型链进一步被覆盖。

关于您的附加问题:以下代码构建了一个不可直接访问的函数:

Class = function () {
   var imprivate = function(){...};
   this.doSomething = function() { uses imprivate};
}

缺点是每个实例都有不同的函数实例Class。这通常是为了modules(您只有一个实例)。就我个人而言,我更喜欢完全按照 ThiefMaster 在评论中的建议进行操作:我将我的私有函数前缀为_ :

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

Javascript:何时在构造函数内定义函数以及何时使用原型? 的相关文章

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

    我制作了一个时间计数器 您可以通过单击按钮来增加或减少时间 然而 我希望当我单击并按住按钮时 时间的价值会不断攀升 所以目前如果你看到我的Plunkr http plnkr co edit BxX9x5zYFMXVqt5JsN1F p pr
  • 如果对象包含在另一个数组中,则从数组中删除该对象

    我试图从数组中删除一个对象 如果该对象的属性 唯一 包含在另一个数组中 我知道我可以像这样执行嵌套 for 循环 for i 0 i lt array length i for j 0 j lt array2 length j if arr
  • 如何更改传单中功能集的样式?

    我正在看等值区域的例子 https leafletjs com examples choropleth https leafletjs com examples choropleth 这是他们使用的数据源 type Feature prop
  • 取消html5浏览器中的单图请求

    我正在动态加载 大 图像以绘制到 html5 画布中 如下所示 var t new Image t onload t src http myurl 但每隔一段时间就会想取消图片请求完全地 我想出的唯一方法是设置src to i e t sr
  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • 如何仅在 NextJS 站点构建期间使用 getInitialProps?

    当使用 NextJS 构建静态站点时 我想要getInitialProps方法仅在构建步骤期间触发 而不是在客户端上触发 在构建步骤中 NextJS 运行getInitialProps 方法 https nextjs org docs fe
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • Ember.js 处理 View 事件后转换到路由

    Setup 我有一个 Ember 应用程序 支持使用 Imgur API 上传图像 我已经有一个工作路线和模板来处理任何 Imgur ID 但我想在上传新图像后转换到此路线 使用返回的 Imgur ID 这是该应用程序的相关部分 http
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • 类型“typeof import("/home/kartik/Desktop/Ecommerce/ecommerce/node_modules/firebase/index")”上不存在属性“auth”。 TS(2339)

    我是 FireBase 的初学者 我正在尝试使用 Angular 通过 FireBase 实现 Google 登录 我在 auth 时收到上述错误 我特此附上login component ts和package json package l
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • 如何在打字稿文件中导入没有定义文件的js库

    随着我们的项目变得越来越大 我想从 JavaScript 切换到 TypeScript 以帮助进行代码管理 然而 我们使用许多库作为 amd 模块 我们不想将其转换为 TypeScript 我们仍然想将它们导入 TypeScript 文件
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗

随机推荐

  • 实例化一个特质意味着什么?

    我是 Scala 新手 在 O Reilly 的 Scala 编程 一书中 作者展示了一些实例化特征的代码 鉴于特征在某种程度上类似于 Java 中的接口 尽管我知道特征是作为字节代码中的类实现的 实例化特征意味着什么 以及适当的用例 设计
  • 从公钥正确创建 RSACryptoServiceProvider

    我目前正在尝试创建一个RSACryptoServiceProvider仅来自解码的 PEM 文件的对象 经过几天的搜索 我确实设法找到了一个可行的解决方案 但它还不是一个可以投入生产的解决方案 简而言之 为了创建一个RSACryptoSer
  • 从 ASP.NET MVC 中的现有数据库生成种子代码

    我想知道是否有人遇到过类似的挑战 我有一个数据库 其中包含一些从 Excel 文件进行 ETL 处理 导入和转换 的数据 在我的 ASP NET MVC Web 应用程序中 我使用 Code First 方法并在每次数据库更改时删除 创建
  • 如何使 pyplot.subplots 内的图像更大

    我需要在网格中显示20张图像 我的代码如下 def plot matric demo img nrows ncols fig ax plt subplots nrows nrows ncols ncols cur index 0 for r
  • Python 列表字典中的项目计数

    我有一个列表字典 我想为其添加一个值到特定列表 我有以下列表词典 d a 4 Adam 2 b 3 John 4 c 4 Adam 3 d 4 Bill 3 e 4 Bob f 4 Joe g 4 Bill 我想本质上计算出名字的数量并返回
  • 使用scipy高斯核密度估计计算CDF逆

    The gaussian kde函数于scipy stats有一个功能evaluate可以返回输入点的 PDF 值 我正在尝试使用gaussian kde估计逆 CDF 其动机是生成一些输入数据的蒙特卡罗实现 这些数据的统计分布是使用 KD
  • 使用 Pandoc 将 Markdown 转换为 PDF 时使用 CSS

    我正在 OS X 上尝试 Pandoc 迄今为止的结果令人印象深刻 然而 一个阻碍性问题是让 CSS 样式在内联代码示例上工作 我正在从 Markdown 转换为 PDF 我的源代码中有这个字符串 Create a simple HTML
  • 如何找到给定半径内最近的城市?

    您是否知道一些实用程序或网站 我可以在其中提供美国城市 州和以英里为单位的径向距离作为输入 并且它会返回该半径内的所有城市 Thanks 我是这样做的 您可以获得城市 街道 邮政编码及其纬度和经度的列表 我一时想不起我们是从哪里得到的 ed
  • ASP.NET MVC OWIN 和 SignalR - 两个 Startup.cs 文件

    我的项目有问题 我使用 ASP NET MVC 和 ASP NET Identity 2 0 进行身份验证 并将 SignalR 添加到项目中 所以现在我有两个 Startup cs 文件 根目录中 MVC 中的第一个 assembly O
  • Python 2.7 Cx_Freeze:导入错误:没有名为 __startup__ 的模块

    我正在尝试使用 cx Freeze 将 Python 中的 hello world 程序编译为 Linux 上的独立二进制文件 包 运行 cx Freeze 时 它 会完成且不会出现错误 但是当我尝试运行生成的可执行文件时 出现错误 Imp
  • 为什么 jQuery 在我的 GreaseMonkey 脚本中加载两次

    由于某种原因 我的 Firefox4 GreaseMonkey 脚本加载 jQuery 两次 我复制并粘贴了以下代码片段 测试 警报显示两次 Regards var Add jQuery function if typeof unsafeW
  • 在 IE 9 中通过 javascript 更改文档正文字体大小时选择框截断文本

    IE 9 对我来说表现得很奇怪 我有一个页面字体大小更改控件 可以保存用户设置 然后在文档中将正文字体大小设置为该大小 它工作正常 问题是 当加载带有下拉菜单的页面时 在 IE 9 中 有时文本会被截断 我已将代码简化为这个 jsfiddl
  • 为什么 NSFetchedResultsController 没有用新数据更新?

    我的核心数据模型有两个实体 Author and Book具有一对多关系 一位作者 gt 多本书 在主视图中 我显示一个书籍列表 其中每个单元格包含书籍名称和作者姓名 该视图还分为多个部分 每个部分的标题是作者姓名 请注意 author n
  • UICollectionViewCell 子类的 contentView.translatesAutoResizingMaskToConstraints 是否应该设置为“false”?

    TL DR 当尝试通过自动布局调整 UICollectionViewCells 的大小时 即使是一个简单的示例 您也可以轻松获得自动布局警告 我们应该设置contentView translatesAutoResizingMaskToCon
  • 从 C# 代码内部访问 F# 列表

    我编写了一个 F 模块 其中包含一个列表 module MyModule type X valuex float32 let l for i in 1 10 gt valuex 3 3f 现在 我尝试从 C 类访问先前定义的列表 但我不知道
  • 如何在 javascript 中动态创建具有值数组的地图

    我有这个要求 根据函数中传递的参数数量 我需要在映射中创建那么多条目 假设我有一个函数 myfunc1 a b c 我需要一张键为 a b 和 c 的映射 并且每个键可以有多个值 但问题是我事先不知道这些键会有多少值 当值出现时 我需要将它
  • openssl 中是否有任何 C API 可以从给定字符串派生密钥

    我需要 openssl 库中的 C API 来从给定的字符串派生密钥 我在哪里可以获得这方面的示例源代码 执行此操作的标准算法是 PBKDF2 PBKDF2 的缩写 基于密码的密钥派生函数版本 2 OpenSSL 中有一个 PBKDF2 的
  • 确定我的电脑是否支持硬件虚拟化

    一般来说 如何确定一台 PC 是否支持硬件虚拟化 我使用 VirtualPC 来设置并行测试环境 并且我会享受一点速度提升 下载这个 http www cpuid com cpuz php 还要检查 http en wikipedia or
  • 检查用户名或用户电子邮件已存在

    我正在一个简单的注册页面中工作 用户无法输入相同的用户名或电子邮件 我编写了一个代码来阻止用户输入用户名并且它起作用了 但是当我试图阻止用户输入相同的用户名时或通过电子邮件发送它不起作用 我的问题是 如何添加另一个条件 使用户无法输入已存在
  • Javascript:何时在构造函数内定义函数以及何时使用原型?

    我注意到在各种教程中向 类 添加函数的不同方法 第一个是在类的构造函数中 Class function this doSomething function 另一种是 Class function Class prototype doSome