即使忘记了“new”,我什么时候应该自动创建一个对象?

2024-02-29

假设我有以下对象构造函数:

function Foo(bar) {
    this.bar = bar;
}

如果我在全局范围内运行该函数而不使用new关键字然后bar将被设置在任何范围内Foo()被称为:

var foo = Foo(42);
console.log(bar); // 42
console.log(foo.bar); // ERROR

所以我的想法是做这样的事情:

function Foo(bar) {
    if(!(this instanceof Foo)) {
        // return a Foo object
        return new Foo(bar);
    }
    this.bar = bar;
}

这样如果我这样做new Foo(42) or Foo(42), 它会always返回一个Foo object.

Is this ever一个好主意?如果是的话,什么时候?什么时候(以及为什么)避免这种技术是明智的?


当您想要时这可能很有用内部构造一个对象包装器。

一个鲜为人知的库内部使用了这种方法,jQuery。

他们不使用instanceof不过再接近一点。每次调用 jQuery 时,它都会自动执行以下操作:

// Define a local copy of jQuery
jQuery = function( selector, context ) {
 // Need init if jQuery is called (just allow error to be thrown if not included)
 return new jQuery.fn.init( selector, context );
}

它所做的一切在内部都会引用这个本地副本。在工作结束时,它将其附加到全局范围

window.jQuery = window.$ = jQuery;

所以每次你打电话$()它内部使用new。它还假设你这样做not use new从外部来看,但它并不关心你是否这样做。


edit

jsFiddle Demo http://jsfiddle.net/G69sR/

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

即使忘记了“new”,我什么时候应该自动创建一个对象? 的相关文章

  • 从 json 数组中获取成对的值

    首先 这是我从 php 源获取的 json 值 oid 2 cid 107 oid 4 cid 98 oid 4 cid 99 之后 我想要得到并且oid值以及相应的cid值例如 oid 2 and cid 107一口气 oid 4 and
  • 禁用小写字符下划线:g q p j y?

    有时您不希望下划线盲目地穿过带下划线的页面标题 有没有办法自动优雅地禁用强调对于某些小写字符 在这些情况下 最好不要在这些小写字母下划线 例如 g q p j y CSS h1 text decoration underline PAGE
  • model.save() 返回无效输出

    我正在使用本文中的 Node js mongodb 和express 对 REST Api 进行简单测试 MERN 第一部分 使用 Node js 和 Express 构建 RESTful API https medium com week
  • Firebase HTTP Cloud Functions - 读取数据库一次

    我有 Firebase HTTPs 功能 该函数需要根据查询参数从 Firebase 数据库读取值 并根据该数据返回结果 Firebase JS SDK 表示要使用以下命令来执行此操作 return firebase database re
  • jQuery show() 和 hide() 的更流畅替代方案

    我有一个带有隐藏列的页面设置 使用 jQuery show 和 hide 函数将列滑入和滑出 然而 它有点 笨重 并且在显示 隐藏时看起来不太流畅 相比之下 我还有一个使用 jquery UI 手风琴的页面部分 当在这些部分之间切换时 过渡
  • flexslider 中的 GIF 滑块,如何仅在滑块上时开始 gif

    现在我有一个带有四个幻灯片的 Flexslider 第三个滑块是 gif 而不是像其他滑块一样是 jpg 我遇到的问题是 第三个 gif 滑块显然在到达页面时立即启动 而不是在您实际到达该滑块时启动 当点击前两个滑块时 gif 就快完成了
  • Karma + JSPM + Typescript - 未找到“.ts.js”

    主要只是想让 Karma JSPM 在加载 ts 文件时发挥良好作用 但绝对没有运气 我看到一个讨论库 https github com Larchy karma jspm typescript coverage tree master一个
  • 在 Angular JS 中撤消重做

    我有一个大对象排列在 rootScope 中 比如说 gt 100 个对象 每个对象又具有对象 数组的层次结构 我想使用 deepWatching watch 整个 rootScope 即将 watch 的第三个参数设置为 TRUE 但这里
  • Google App Script postMessage 与收件人窗口的来源不匹配

    我有一个 Google App 脚本部署为Web应用程序 https developers google com apps script guides web 它工作正常 直到今天晚上我发现它无法在 Firefox 或 Chrome 中加载
  • 我可以阻止history.popstate在初始页面加载时触发吗?

    我正在开发一个通过 AJAX 提供内容的网站 如果您单击菜单中的某个项目 内容 div 会更新为 get回应 没什么花哨的 我正在实施history pushState允许使用浏览器的后退 前进按钮进行导航 我有以下内容可以在历史导航上加载
  • 为什么 html 中的 AngularJS 错误没有显示在控制台中?

    Here s a fiddle http jsfiddle net 6y7odxmj 3 用于说明 当 ng click 指令 例如 调用未在控制器的 scope 或其父级 上定义的函数时 它会默默地失败 当我尝试调试网页时 这种行为令人抓
  • Javascript 函数,我如何开始理解它们?

    我完全理解 为了学习 javascript 我需要知道函数是如何工作的 我了解传递参数的基础知识 然后使用值调用函数以将某些内容添加到一起 等等 我读过无数关于函数的文章 例如以及书籍等 但我只是不明白它们是如何使用的以及何时应该使用它们等
  • Javascript for 循环跳过最后一个元素

    我有一个数组 根据某些条件从中删除某些元素 当我删除元素时 我会重新启动 for 循环 因为索引已刷新 var k for k 0 k lt this j data length k if condition true this j dat
  • Angular2 - 防止复选框被选中

    我有一个每行包含一个复选框的表 在表头中 我有一个Check All切换所有表格行框的复选框 我正在尝试实现一些逻辑 如果复选框的数量将超过特定限制 则显示错误并且不切换表行复选框或checkall盒子本身 有一个问题允许checkAll即
  • 如何使用 Ajax 在 Flask 中发布按钮值而不刷新页面?

    我有一个问题 当我单击 Flask 应用程序中的按钮时 我想避免重新加载 我知道有 Ajax 解决方案 但我想知道如何将我的按钮链接到 ajax 函数以发布按钮值并运行链接到其值的 python 函数 这是我的 html 按钮 div di
  • 谷歌绘制具有相同比例的多个系列的图表

    我正在寻找一种在图形上显示多个系列的方法 这些系列具有相同的比例但仅显示一次 正如你在这里看到的 http jsfiddle net Youkoal d3xwnqdu http jsfiddle net Youkoal d3xwnqdu 我
  • 角度距离计算

    我正在使用角度制作距离计算应用程序 Html
  • Javascript For 循环在 dom 元素上执行[重复]

    这个问题在这里已经有答案了 我有 javascript 代码来获取具有类名称的元素 并迭代从元素中删除该类 var elements document getElementsByClassName test console log Leng
  • D3.js - 更改鼠标悬停时元素的不透明度 IF 条件 = false

    我正在制作一个带有过滤器的交互式 D3 js 图表 当用户单击选定的复选框时 该过滤器会显示点 此外 在鼠标悬停事件上 所选点旁边将出现一个弹出窗口 其中包含一些信息 由于图表上的点数量相对较多 因此我选择在取消选中相应复选框时使相关点变得
  • JavaScript 开关(真)

    你好 我正在尝试处理 ajax json 响应 这是我的代码 success function j switch true case j choice1 alert choice2 break case j choice2 alert ch

随机推荐

  • 如何定义具有键类型和值类型之间相关性的 Map,而它们都是并集

    这是显示我想要实现的目标的示例 除了两个问题之外 它几乎可以工作 设置不显示错误代码的错误 Immer Draft 类型 或任何 DeepWritable 实用程序类型 完全搞乱了这个技巧 基本上在我看来 我在这里所做的事情并不是什么真正的
  • 在 scrapyd 中启用 HttpProxyMiddleware

    阅读scrapy文档后 我认为HttpProxyMiddleware是默认启用的 但是当我通过 scrapyd 的 webservice 接口启动蜘蛛时 HttpProxyMiddleware 未启用 我收到以下输出 2013 02 18
  • 如何获取适用于 adMob 的测试广告横幅并测试插页式广告?

    我正在尝试设置 adMob 广告 我有两个问题 1 我是否正确使用了 adListener 接口 2 为什么我看不到插页式广告 让我们从 adListener 开始 据我从说明中了解到 adListener 是一个接口 所以我创建了一个界面
  • (iPhone) 我可以使用调度程序进行 AudioServicesPlaySystemSound 循环吗?

    我可以使用调度程序进行 AudioServicesPlaySystemSound 循环吗 一个问题是我无法获得声音持续时间 有什么方法可以获取持续时间 以便我可以动态创建循环声音的调度程序 据我所知 AudioService 没有内置循环和
  • 消息总线和消息队列理解

    我想知道我对消息总线和消息队列工作原理的理解是否正确 首先 我需要明确命名 服务巴士可以与以下互换使用消息总线 这是一种发布者 订阅者类型的系统 其中消息被添加到任意数量的发布者的消息集合中 并且任意数量的订阅者可以从中读取消息 到目前为止
  • Java 和 C++ 中的构建器?

    在谷歌的协议缓冲区 http code google com p protobuf API for Java 他们使用这些漂亮的构建器来创建对象 请参阅here http code google com apis protocolbuffe
  • 如何计算pandas中的逆累积和

    我正在尝试找到一种方法来计算熊猫的逆累积和 这意味着申请cumsum但从下到上 我面临的问题是 我试图找到西班牙每个月从上到下的工作天数 第一个工作天 1 第二个工作天 2 第三个工作天 3 等等 并且从下到上 最后一个工作日 1 前一天
  • FTYPE/ASSOC 优先级并从命令行添加到 OpenWithList

    不确定这是否属于超级用户 但这里似乎有一个 cmd exe 标签 所以这里 作为背景 我正在开发一个 Firefox 附加组件 顺便说一句 这个问题不需要 Firefox 的知识 因为 Firefox 附加组件可以调用命令行 该附加组件旨在
  • 在 C# 中覆盖图像图片框

    我正在做一个应用程序 我添加一个图片框以将图像添加到某些产品中 我有一个问题 我想编辑已添加到某个产品中的图像 我该怎么做 这是我的实际代码 private void pbImagenEquipo DoubleClick object se
  • 如何只读取文本文件每行的第一个单词?

    我想知道如何只能读取文本文件中每行的第一个单词 我尝试了各种代码并尝试更改代码 但只能设法从文本文件中读取整行 我使用的代码如下所示 QuizList with open Quizzes txt r as f for line in f Q
  • 在毕加索中加载实际图像之前模糊缩略图

    我正在使用 picasso 显示来自 URL 的图像 我在加载实际图像之前先显示缩略图 我想模糊该缩略图 我如何在 picasso 中实现 这是我的源代码 pb setVisibility View GONE Picasso with ge
  • 根据打字稿函数中的另一个参数限制一个参数的类型

    interface INavigation children string initial string function navigation children initial INavigation return null 我有一个类似
  • Java 中的 StAX XML 格式化

    是否可以使用 StAX 特别是 woodstox 使用换行符和制表符格式化输出 xml 即采用以下形式
  • sbt 0.13.8 URI 有一个权限组件

    在 sbt 项目中运行 sbt 时出现此错误 我有 JDK 8 和 sbt 0 13 8 我可以毫无问题地运行 activator 命令 但我需要 sbt 工作 因为我的 IDE IntelliJ IDEA 使用它来加载项目 E work
  • ebean 和 play 框架中的复合键

    我刚刚开始使用 Play 框架 完成教程 涵盖基本功能 后 我尝试在数据库和游戏之间设置连接 我的一个关系有模式 CREATE TABLE IF NOT EXISTS shop CatPath parentC INT NOT NULL ch
  • 即使使用 sudo,也无法以 +x 权限执行脚本文件

    我无法从已安装的分区运行脚本 我创建了一个基本的 Hello World 脚本 可以从我的主目录正常执行 但是当我将其移动到已安装的分区时 我无法执行该文件 ls l rwxr xr x 1 user user 31 Mar 4 21 33
  • -1103错误域= NSURLErrorDomain代码= -1103“资源超出最大大小”iOS 13

    当 iOS 13 上的响应较大 14kb 时 我们会遇到以下网络错误 1103 Error Domain NSURLErrorDomain Code 1103 resource exceeds maximum size 由于我们使用 Ala
  • ExtJS 中自动调整文本字段标签大小

    在 ExtJS 中 是否可以将文本字段的标签调整为最佳大小以使其文本适合一行 The labelWidth http docs sencha com extjs 4 1 1 api Ext form Labelable cfg labelW
  • 按字母顺序搜索名称的查询

    我已经用过LIKE条件 但它要求我将全名输入数据库才能找到名称 if searchby equals Name try Class forName sun jdbc odbc JdbcOdbcDriver System out printl
  • 即使忘记了“new”,我什么时候应该自动创建一个对象?

    假设我有以下对象构造函数 function Foo bar this bar bar 如果我在全局范围内运行该函数而不使用new关键字然后bar将被设置在任何范围内Foo 被称为 var foo Foo 42 console log bar