Javascript:关于如何定义新数据类型有哪些指导原则?

2023-11-23

假设您正在创建数据类型并公开其行为。

您能否举例说明何时使用:

  • 一个功能和新功能:

    // define new data type
    var CustomDataType= function(){ 
                          this.a='whatever';
                          this.doX= function(){/*some code*/};
                        }
    
    // create a new instance of our custom data type
    var obj= new customDataType();
    
  • 对象字面量 & Object.create:

    // define new data type
    var customDataType = {
                           a: 'whatever',
                           doX: function(){/*some code*/}
                         }
    
    // create a new instance of our custom data type
    var obj= Object.create(customDataType);
    
  • 构建对象的函数:

    function customDataTypeFactory(options){
      return {
               a: 'whatever',
               doX: function(){/*some code*/}
             }
    };
    
    // create a new instance of our custom data type
    var obj= customDataTypeFactory(options);
    

我觉得这可能会被标记为重复:new vs Object.create但我的主要兴趣不是讨论哪一个更好,而是想知道是否存在特定的用例,其中一个应该优于其他用例。

我读过很多关于相关问题的帖子和 Crockford 的书:Javascript:好的部分。到目前为止,我得出的结论是,这是一个偏好问题,尽管克罗克福德的建议与我产生了很大的共鸣:“尽量避免危险和不必要的功能”......我正在谈论new.


我将从通常定义类的方式开始:

function CustomDataType(a)
{
  this.a = a;
  this.b = 2;
}
CustomDataType.prototype = {
  doX : function () {}
};
var obj = new CustomDataType(1);

我在构造函数中分配变量是因为F.prototype = { a : [1,2,3]; }是有问题的,除非在构造函数中重新初始化该属性,否则该数组将在实例之间共享(对于所有非基本类型都有问题)。当属性以某种方式依赖于构造函数的参数时,也需要它。我在原型中声明方法,以便它们在所有实例之间共享,如果您使用继承,则意味着您可以进行超级调用,这也会导致更少的内存使用,因为该方法只需分配一次(尽管这可能不是)这是一个大问题)。

我从来没有用过Object.create,我不认为有任何理由这样做,除非你热衷于一些疯狂的动态黑客行为。

每当感觉没有必要为对象创建单独的类时,我都会使用对象文字,例如,如果它是方法的参数(因此调用者不必显式实例化某些内容),或者如果它是一些不应访问的内部值由其他任何人。

您的工厂本质上与对象字面量相同。我想如果您需要创建一些 jsonesque 结构并设置一些默认值,它会很有用。

我不明白为什么new是危险的或不必要的,他是在什么背景下说的?

但我认为很大程度上取决于品味。保持一致,不要使事情复杂化。

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

Javascript:关于如何定义新数据类型有哪些指导原则? 的相关文章

  • Kendo UI 网格过滤器日期格式

    在我的剑道网格中 我想更改过滤器中的日期格式 例如 2015年1月30日至2015年1月30日 我已经更改了开始日期的日期格式 field StartDate title Start Date width 30 format 0 MMM d
  • JS 在两个或多个点之间画线

    我需要在两个标签或标签之间画一条线 Example http caitriona github io connect the dots http caitriona github io connect the dots 我需要做这样的事情
  • 将 Json 数据返回给 Ajax 调用

    我在 MVC 中有一个方法 我将其发布到它 并且我需要返回一些数据以进行处理 这是我发布到的 MVC 方法 返回值是 json 数据 HttpPost public JsonResult GetCalculateAmortizationSc
  • 在 C# 中转换为反射类型

    考虑以下代码 object objFoo MakeFoo object MakeFoo return new Foo MethodInfo methodInfo typeof Program GetMethod Baz Foo Baz re
  • Javascript 制作音频 blob

    我正在测试 html 音频标签 我想制作音频 blob url 就像 youtube 或 vimeo 那样 并将其添加到 src 开始播放音频 我一直在测试new Blob and URL createObjectURL 但我不知道如何使用
  • 在each() 和forEach() 中使用break 和 continue

    如果我们不能使用 break 和 continue 关键字 我不确定我是否理解函数式循环 映射的价值 我可以做这个 collections users models forEach function item index can t use
  • 在Javascript中将RGB数组转换为RGBA数组的快速方法

    我正在使用的模拟器在内部存储 RGB 值的一维帧缓冲区 但是 HTML5 画布在调用 putImageData 时使用 RGBA 值 为了显示帧缓冲区 我当前循环遍历 RGB 数组并以某种方式创建一个新的 RGBA 数组与此类似 https
  • 预加载 javascript 和 css 文件

    我目前正在开发一个移动网站 该网站大量使用图像 CSS 和 JavaScript 例如 它使用未压缩的 150KB 的库 我为图像构建了一个预加载器 效果相当好 function loadImages images var sum 0 fo
  • Moment.js 动态更新时间(以秒为单位)

    我试图显示时钟 that 每秒更新一次 e g 2015 年 1 月 5 日 12 05 01 它似乎对我来说工作得很好 对于相同的代码 并且只有 moment min js 指向v2 11 0 看看代码 来源 MilkyWayJoe va
  • 使用淘汰赛动态显示/隐藏元素

    我有一个表 有四列 即代码 名称 数量和价格 其中 我想动态更改数量列的内容 元素 通常 它应该显示其中显示数量的元素 当用户单击元素时 我想显示该元素 以便用户可以编辑数量 我正在尝试按照 示例2 来实现淘汰赛文档链接 http knoc
  • Jquery 子元素发生变化

    我正在尝试使用 jquery 在子元素 在本例中为 select 更改时触发事件 这是我的 HTML div class row addForm div class col lg 2 col md 2 col sm 3 col xs 6 d
  • 如何处理 setTimeout() 的多个实例?

    阻止创建 setTimeout 函数的多个实例 在 JavaScript 中 的最推荐 最佳方法是什么 一个例子 伪代码 function mouseClick moveDiv div 0001 mouseX mouseY function
  • FullCalendar:如何重新创建/重新初始化 FullCalendar 或批量添加多个事件

    我正在尝试将新事件批量添加到日历中 但未能找到方便的使用方法 所以我决定用新的事件数组重新初始化视图 所以我尝试了以下方法 var events title Event start new Date y m d 10 description
  • 如何在使用类型分散时将箭头添加到行尾

    如何在 y 不等于 0 且系列类型以线宽 2 分散的情况下正确地将箭头添加到行的每一端 在这里我可以看到箭头已添加但未正确添加 请看这个 部分工作小提琴 http jsfiddle net vnYCX 这是我的 JS 最初的原型是由 sta
  • 如何使用 Node.js 解析 JSON? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我应该如何使用 Node js 解析 JSON 是否有一些模块可以安全地验证和解析 JSON 你可以简单地使用JSON parse h
  • Intern JS - 如何在链式 Command 方法中使用 Promise.all()?

    我是用 Intern JS 编写测试的新手 并且一直在遵循他们的文档来使用对象接口 https theintern github io intern interface object and 页面对象 https theintern git
  • 如何使用 API 中的数据填充选择的下拉元素 - ReactJS

    我对 React 还很陌生 我正在从 API 获取数据 当我检查控制台日志时可以看到数据 但是我不知道如何使用 map 创建一个新数组 然后选项元素可以使用该数组来显示货币代码 目前它填充下拉列表 但选项元素全部为空 结果显示为 NaN 下
  • Dojo“正在加载”消息

    我是 Dojo 新手 所以我需要一些帮助 我的一些链接需要一段时间 当用户单击时 页面开始加载需要几秒钟 我想添加一条 正在加载 消息 我可以用 旧时尚方式 来做 但我想学习新的 更简单 更智能的 Dojo 方式 具体如何工作现在并不重要
  • redux - 如何存储和更新键/值对

    我正在使用 redux 和 React js 我想存储简单的键 值对 但无法获得正确的减速器语法 在这种情况下 每个键 值对将保持与外部系统的连接 这是正确的做法吗 我刚开始使用 redux 所以这有点神秘 export default s
  • React Router Tabs——保持组件安装

    我使用 React Router 创建了选项卡 每个选项卡都有不同的路线 但是 我想通过保持隐藏选项卡的安装来维护选项卡转换之间的选项卡状态 我该如何实现这一目标 每次路由切换时 React 路由器都会重新安装每个组件 已经有人问过这个问题

随机推荐

  • 为什么“summarize”会删除一个组?

    我在胡闹babynames pkg A group by命令有效 但之后summarize 其中一个组将从组列表中删除 library babynames babynames 1 10000 gt group by year name gt
  • D3.js线性回归

    我搜索了一些有关构建线性回归的帮助 并在这里找到了一些示例 非线性回归函数还有一些应该涵盖这一点的 js 库 但不幸的是我无法使它们正常工作 简单统计 js和这个 回归 js With regression js我能够得到m and b线的
  • Android:注册意图过滤器以使用我的应用程序打开电子邮件附件

    我有一个可以生成自定义文件类型 sor 的应用程序 在应用程序内部 我有一个功能可以发送附有这些文件之一的电子邮件 我还有一个意图过滤器 允许应用程序显示在可以打开此类文件的应用程序列表中 这使我 有时 可以直接从手机上的用户电子邮件客户端
  • 强类型数据集与弱类型数据集

    Net 中的强类型数据集是什么意思 有人可以用一个清晰 而简短的例子来解释吗 另外 强类型数据集和弱类型数据集之间有什么区别 强类型数据集基于 Db Schema 生成 它们由从 DataSet DataTable 和 DataRow 派生
  • Django TestCase 不使用辅助数据库上的事务

    我正在使用 Django 1 3 1 我有两个数据库 我的一些模型位于一个数据库中 一些模型位于另一个数据库中 这两个数据库都是 contrib gis db backends postgis 数据库 令我惊讶的是 Django 的 Tes
  • GWT:如何避免在生成的JavaScript代码中调用dynamicCast和canCastUnsafe?

    我正在用 Java 编写一些特殊用途的数据结构 旨在在浏览器中使用 使用 GWT 编译为 JavaScript 我正在尝试匹配一些内置 JDK 类的性能 我注意到运行速度相当快 但是当我将我的代码跟踪与一些模拟的 JDK 代码进行比较时 我
  • 使用 HTML/JavaScript 检测本地文件拖放

    有一个 HTML 文本区域 我能够在以下情况下捕获该事件 本地文件被拖放到文本区域上 但如何获取删除的文件名 最后修改并插入到文本区域中 在这种情况下 以下表达式返回 None event dataTransfer files event
  • 如何使用 Access/VBA 复制到剪贴板?

    在 Access 2003 2007 中使用 VBA 如何将字符串变量的内容复制到剪贴板 这个网站建议创建一个零长度的文本框 将字符串复制到文本框 然后运行DoCmd RunCommand acCmdCopy 啊 我的意思是 我们可以沿着这
  • C# 中是否可以合并 string 和 DBNull?

    我正在编写一个 C 例程来调用存储过程 在我传入的参数列表中 其中一个值可能合法地为空 所以我想我会使用这样的行 cmd Parameters Add new SqlParameter theParam theParam DBNull Va
  • PHP 将一个类的实例传递给另一个类

    我对 PHP OO 编程技术还是比较陌生 我有一个非常简单的广泛问题 在类中实例化一个类然后将该实例传递给另一个类通常是不好的做法吗 我想要的是能够创建我知道在每个用户请求中始终需要的特定类的实例 第二类不仅仅是一个辅助类 理想情况下在我的
  • java:为什么局部变量应该声明为final [重复]

    这个问题在这里已经有答案了 可能的重复 在Java中将方法参数声明为final是否有任何性能原因 为什么在 Java 中将局部变量和方法参数标记为 final 我正在使用 PMD 来查看代码违规情况 在 webService 方法中 我有下
  • C# 如何检查两个值之一是否为 TRUE?

    对于 C 专家来说这应该是一个简单的问题 我基本上想检查一个值或另一个值是否为 TRUE 代码如下 if Boolean Parse staff getValue Male Boolean Parse staff getValue Fema
  • 更改 DataGridView 中按钮的颜色

    我到处寻找这个问题的答案 这篇文章的答案 更改 DataGridView 单元格中按钮的颜色没有回答我关于字体的问题 我已经尝试过以下方法 DataGridViewRow r dataGridView Rows 0 r Cells 1 St
  • 用于 PHP 的 Microsoft sqlsrv 驱动程序在查询“SELECT SCOPE_IDENTITY() AS id”时不返回任何结果

    使用 php mssql 驱动程序 此查询工作正常 INSERT INTO Table columnName VALUES text SELECT SCOPE IDENTITY AS id 表确实有一个 id 列 它是一个标识 我将执行该查
  • MVC - 模型与同一页面上的多个实体绑定

    我想知道如何在从页面上多个实体返回信息的场景中使用模型绑定 我想显示来自两个单独实体的字段组合 即客户 地址 我正在为我的模型使用 Microsoft 的 DAAB 和自定义业务实体 有任何想法吗 如果您尝试在回发时绑定到多个模型 则应尝试
  • 如何在 MS SQL Server 2008 上设置日期格式

    我想根据模式格式化日期 例如 22 01 2015 或 2016 12 15 在 NET Framework 中 我们有 DateTime gt ToString 方法 它接受格式作为参数 甚至接受 string Format 它的作用相同
  • 在 Web 应用程序中处理时区

    在我们的网络应用程序中 我们需要显示并输入 不同时区不同国家的日期时间信息 目前 我们正在为每个国家 地区维护单独的 Web 服务器和单独的数据库 oracle 11g 我们计划将所有内容合并到一个具有单一数据库 Oracle 11g 的门
  • 如何在此 SSRS 表达式中“指定数据集聚合”?

    我的 SSRS 报告中需要一个行值 该值是根据报告中已使用的几个字段计算得出的 我希望它显示在名为 textboxPercentageValue 的文本框中 用半简单的英语来说 表达式 公式是 If the value of the Wee
  • Android 自定义 ArrayAdapter 在过滤后不刷新

    所以我有一个习惯ArrayAdapter所以我可以使用标题 副标题视图ListView 我有一个EditText它接受一个字符串并过滤适配器 过滤器的工作原理是过滤正确的对象 我可以通过单击它来判断 它以正确的 附加 开始意图 但是 即使过
  • Javascript:关于如何定义新数据类型有哪些指导原则?

    假设您正在创建数据类型并公开其行为 您能否举例说明何时使用 一个功能和新功能 define new data type var CustomDataType function this a whatever this doX functio