首页
学习
活动
专区
圈层
工具
发布

当`new`不是可选的时候?

在JavaScript中,new操作符用于创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。当构造函数要求必须使用new时,直接调用(不带new)会导致问题。以下是详细分析:

基础概念

  1. 构造函数设计 当函数设计为构造函数时,通常约定首字母大写(如Person),并通过new调用。此时:
    • this指向新创建的实例
    • 隐式返回this(除非显式返回其他对象)
  • new调用的风险 若直接调用构造函数(如Person()):
    • 非严格模式下:this指向全局对象(如window),导致属性泄露到全局。
    • 严格模式下:thisundefined,触发错误。

原因分析

为什么new不可省略?

  1. this绑定失效 构造函数依赖new来正确绑定this到新实例。无new时,this行为不符合预期。
  2. 原型链断裂 通过new创建的实例能访问构造函数的prototype属性。直接调用时,实例化过程缺失,原型链无法建立。
  3. 返回值异常 构造函数通常不显式返回,若直接调用可能返回undefined或全局对象。

解决方案

1. 强制new调用

代码语言:txt
复制
function Person(name) {
  if (!(this instanceof Person)) {
    throw new Error("必须使用 new 调用构造函数");
  }
  this.name = name;
}

// 正确
const p1 = new Person("Alice");

// 错误(直接调用)
const p2 = Person("Bob"); // 抛出错误

2. ES6 Class 语法

Class 必须通过new调用,否则直接报错:

代码语言:txt
复制
class Person {
  constructor(name) {
    this.name = name;
  }
}

const p = new Person("Alice"); // 正确
Person("Bob"); // TypeError: Class constructor cannot be invoked without 'new'

3. 工厂函数模式

若想避免new,可改用工厂函数:

代码语言:txt
复制
function createPerson(name) {
  return { name }; // 直接返回对象
}

const p = createPerson("Alice"); // 无需 new

4. new.target检测(ES6+)

代码语言:txt
复制
function Person(name) {
  if (!new.target) {
    return new Person(name); // 自动补 new
  }
  this.name = name;
}

const p1 = new Person("Alice"); // 正常
const p2 = Person("Bob"); // 自动转为 new Person("Bob")

应用场景

  1. 必须用new的场景
    • 创建需要原型继承的复杂对象(如自定义类、库的API)。
    • 需要隔离实例状态的场景(如React组件类)。
  • 可省略new的场景
    • 工厂模式返回简单对象。
    • 工具函数无状态依赖时(如Math.random())。

示例问题复现与修复

问题代码

代码语言:txt
复制
function Car(model) {
  this.model = model;
}

// 错误调用
const myCar = Car("Tesla");
console.log(model); // 泄露到全局:"Tesla"

修复方案

代码语言:txt
复制
function Car(model) {
  if (!new.target) {
    throw new Error("请使用 new 关键字调用 Car");
  }
  this.model = model;
}

// 正确调用
const myCar = new Car("Tesla");

总结

  • 强制new:通过instanceofnew.target确保构造函数正确调用。
  • 替代方案:使用Class语法或工厂函数规避问题。
  • 核心原则:明确函数设计意图(是否作为构造函数),并通过命名或逻辑约束调用方式。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

当FME不能的时候

大多数时候,FME都很给力,但一个月总有那么……那么……那啥来着。反正就是不好用了。就像这样: ? 你分析好数据,理清思路,然后开开心心的打开软件准备工作了。突然,蹦出 了一个error!...看日志分析数据错误原因吧,日志又写的不清不楚的。 直到写这篇推送,我都不知道到底出现了什么问题。但这并没有影响到我的工作,此路不通,换一条走就好了。...虽然人工做预处理是肯定没问题的,但考虑到数据量还比较大,人工预处理耗时费力。再者,作为一个有追求的工具人,首先要考虑的方式肯定是:用工具!...在这个环节,我把上面预处理后的成果进行了三维化,直接处理成了模型。 ? 数据处理成果 ? 小结 数据处理,相当复杂,中间涉及到的环节很多,说不定什么时候哪个工具或者数据源就掉了链子。...再出现问题的时候,要尽快的去分析,找出问题出现的原因,能解决就解决,不能解决就想办法绕过去。所以多掌握点技能是很有必要的,毕竟,备选方案多一点。

81720

new Vue的时候到底做了什么

,当vm对象创建完成就可以通过vm对象访问到劫持的数据,比如data中的数据,methods中的方法等。...当数据发生变化以后即状态变更的时候,会重新构造新的Vnode对象。...内部的render函数把该组件的tamplate选项的模板解析为一个JS对象,这个对象和DOM节点对象结构一样,然后是数据劫持代理监听,当数据发生变化以后,将旧Vnode对象和生成的新Vnode对象比较差异然后更新...:比较只会在同层级进行, 不会跨层级比较在diff比较的过程中,循环从两边向中间比较图片DIFF算法的过程:当数据发生改变时,订阅者watcher就会调用patch给真实的DOM打补丁通过isSameVnode...渲染模板:有render:这时候优先执行render函数,render优先级 > template。

54440
  • 我进步最大的时候,并不是加班最多的时候

    经过了半年或一年之后,他的技能树的深度没有多少,但起码的广度是够用的了。 于是,他找到了第一份工作。 ? 入职了,内心充实,充满干劲,帝都的雾霾都是甜的。担心自己的能力,内心有一点压力,但动力更多。...截止到2014年我离开北京的时候,他在什么做日历应用的公司,35K月薪。 我问过他,“你一个高中毕业的,你怎么做到的?” 他说,“他的学习是二个方向,一个提高。” 怎么讲呢?...据他说,二个方向一是向上,不断的找自己不会的、新的东西搞懂;二是向下,把基础的东西往深里挖,抓细节。据他说最牛b的时候,那本犀牛书的某些章节他能背下来。 向上怎么学?...不满足于当前,不断的向这三个方向,一个提高高度,一个挖深基础,一个拓展广度。他就是这样学的,现在这个家伙应该已经回广州了吧。 的时候 --> 我呢?...我进步最大的时候,其实是每一次加班之后的恢复阶段,例如项目上线之后的短暂的工作空档。在恢复阶段能够让我静下心来,思考一下自己在这段加班之中遇到了什么、解决了什么、收获了什么。

    56350

    我进步最大的时候,并不是加班最多的时候

    经过了半年或一年之后,他的技能树的深度没有多少,但起码的广度是够用的了。 于是,他找到了第一份工作。 入职了,内心充实,充满干劲,帝都的雾霾都是甜的。担心自己的能力,内心有一点压力,但动力更多。...把不懂的都搞懂; 都懂了能做什么?做别人不能做的。 我一个朋友吧,同行。很俗的开头,确实是朋友同行。他是高中毕业的学历,南方广州那边的人,自学的前端开发,技术牛的很。...截止到2014年我离开北京的时候,他在什么做日历应用的公司,35K月薪。 我问过他,“你一个高中毕业的,你怎么做到的?” 他说,“他的学习是二个方向,一个提高。” 怎么讲呢?...据他说,二个方向一是向上,不断的找自己不会的、新的东西搞懂;二是向下,把基础的东西往深里挖,抓细节。据他说最牛b的时候,那本犀牛书的某些章节他能背下来。 向上怎么学?...我进步最大的时候,其实是每一次加班之后的恢复阶段,例如项目上线之后的短暂的工作空档。在恢复阶段能够让我静下心来,思考一下自己在这段加班之中遇到了什么、解决了什么、收获了什么。

    732100

    当类构造与析构的时候...

    文章目录 什么时候会调用默认构造函数 什么时候调用拷贝构造函数? 什么时候调用赋值运算符? 深拷贝与浅拷贝 成员初始化列表的概念,为什么用它会快一些? 有哪些情况必须用到成员列表初始化?...C++中struct和class的区别 什么时候会调用默认构造函数 1、当不使用任何初始值定义一个类的非静态变量时,会调用该类的默认构造函数。...A a; 2、当类B含有类A的对象,并且使用类B的默认构造函数时,会调用类A的默认构造函数。...class A { public: A(int i){} }; class B { A m_a; }; 3、new一个对象的时候。 4、子类对象默认构造的时候。...析构的时候,如果有基类,且基类的析构函数是虚函数,则先调用自己的构造函数,再调用基类的构造函数。 如果基类的析构函数不是虚函数,则调用基类的析构函数。 ---- 继承机制中对象之间如何转换?

    74320

    实战篇:当Typescript遇上Koa的时候

    显然,上述代码是有错误的,但是极难发现。只有运行它的时候,才能通过堆栈报错来进行定位。但如果借助 ts,就可以立即发现错误,保持代码稳健。...虽然 dev 模式下不会开启,但编写它的时候,引入的config类型是ConfigScheme,在访问ProdConfigScheme上的字段时候 ts 编译器会报错。...这时候,ts 的断言就派上用场了: import config, { ProdConfigScheme } from "./.....根据错误,这里将索引签名字段设置为「可选」即可: const localLogFile: { [level in LogLevel]?...如此,在编写代码的时候,就能立即发现错误。而不是写了几百行,然后跑起来后,根据堆栈报错一行行去定位问题。 仔细想一下,如果是 30 个人合作的大型 node/前端项目,出错的风险会有多高?

    3.1K30

    当遇到OOM的时候,你只会重启吗?

    作者 | 优雅先生 my.oschina.net/feichexia/blog/196575 现实企业级Java应用开发、维护中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足...本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。 而且这些监控、调优工具的使用,无论你是运维、开发、测试,都是必须掌握的。...命令行参数选项说明如下: -q 不输出类名、Jar名和传入main方法的参数 -m 输出传入main方法的参数 -l 输出main类或Jar的全限名 -v 输出传入JVM的参数 比如下面: root...TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用 printf "%x\n" 21742 得到21742的十六进制值为54ee,下面会用到。...jmap -permstat pid 打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图: ?

    1.4K20

    new Vue的时候到底做了什么_2023-03-13

    对象的过程,当vm对象创建完成就可以通过vm对象访问到劫持的数据,比如data中的数据,methods中的方法等。...当数据发生变化以后即状态变更的时候,会重新构造新的Vnode对象。...内部的render函数把该组件的tamplate选项的模板解析为一个JS对象,这个对象和DOM节点对象结构一样,然后是数据劫持代理监听,当数据发生变化以后,将旧Vnode对象和生成的新Vnode对象比较差异然后更新...: 比较只会在同层级进行, 不会跨层级比较 在diff比较的过程中,循环从两边向中间比较 图片 DIFF算法的过程: 当数据发生改变时,订阅者watcher就会调用patch给真实的DOM打补丁 通过isSameVnode...渲染模板: 有render:这时候优先执行render函数,render优先级 > template。

    51110

    运行爬虫的时候电脑是不是不能睡眠?

    一、前言 前几天在Python黄金交流群【Demon.】问了一个运行爬虫程序的时候电脑是不是不能睡眠的问题。 你别看这个问题挺基础的,但是还是挺多人不懂的呢!...对于息屏的设置,就简单了,方法如下图所示。 下次再遇到长时间爬虫的时候,直接息屏就行了,不用在电脑旁边一直等着噢! 三、总结 大家好,我是皮皮。...这篇文章主要解答了运行爬虫的时候电脑是不是不能睡眠的问题,文中针对该问题给出了具体的解析,帮助粉丝顺利解决了问题。...最后感谢粉丝【Demon.】提问,感谢【PI】、【瑜亮老师】给出的具体解析,感谢【冯诚】、【dcpeng】等人参与学习交流。

    1.1K20

    当谈论社区团购的时候,我们在谈什么?

    大量资本的涌入,让这个赛道变得异常拥挤。 要想脱颖而出,成为最终赢家,优质的商品、健全的供应链及高效的运营管理缺一不可,具体表现在获客、留存和盈利等指标上,可以看出头部社区团购平台之间存在的差距。...1/用户:电商行业用户总规模有望与微信接近 以“预售+自提”为主要特征的社区团购为电商行业带来的最大的影响在于也二 次打幵了电商行业用户规模的天花板。...5/战略:大棋局下的兵家必争之地 从更大的一个维度看待买菜业务,我们认为这是综合电商在大棋局下的兵家必争之地。...高频低价的业务属性使得食杂电商有望成为综合电商整体战略的有机组成 部分,或将长期以微亏状态为主站导流。 最终的胜利者或将同时具有1/极具优势 成本曲线;2/深厚的后端变现矩阵以保证引流后的变现效率。...微信生态、物流等基础设施的完善,加上社区团购模式本身效率上的比较优势,是这个业务运转的基础,疫情的催化则为这个业务按下了加速键。

    1.1K00

    如何定位当生产环境CPU飙升的时候的问题

    前言 在当今的信息化时代,计算机系统在各行各业都发挥着重要的作用。然而,当生产环境中的CPU飙升时,系统性能会受到影响,甚至导致整个系统瘫痪。这不仅会对企业造成经济损失,还会对用户体验造成严重影响。...因此,如何定位并解决生产环境中CPU飙升的问题,已成为众多企业和开发人员亟待解决的问题之一。 本文旨在探讨如何定位生产环境中CPU飙升的问题,并提供相应的解决方案。...通过了解CPU飙升的原因、定位方法以及解决方案,企业和开发人员可以更好地应对生产环境中出现的CPU飙升问题,提高系统性能和用户体验。 一、排查思路 解决这个问题的关键是要找到Java代码的位置。...我们找到COMMAND列是java的这一行,说明这个程序就是用Java编写的。然后,用记事本记下这一行的PID,也就是进程ID。...这些工具可以帮助您确定CPU使用率最高的进程,以及CPU使用率与系统负载之间的关系。 分析系统负载 当CPU使用率过高时,通常是由于系统负载过高所致。

    50910

    框架设计 | 当EventBus遇上自撸RxBus的时候?

    大幅提高自身技术实力最有效的途径之一就是学习世界级优秀开源项目的精髓,除了学习款架提供的API, 还有必要进行高端一些的姿势,才能显得你是老司机,今天本文讲述迷途小书生的开车经过过,带你单手手撸RxBus...RxBus升级 在具体使用过程中总会碰到各种各样的问题 场景1 我在上一个项仿今日头条中实现了无限轮播的功能,并且希望轮播图在用户滑动、不可见、以及程序在后台休眠时都停止滚动,这时候就希望EventBus...每个人在开发过程中,或多或少都会碰到内存泄漏的的问题,我一直有一个天真的想法,RxJava那么牛逼,是不是能无声无息地就能解决内存泄漏的问题了,答案是否定的。...我看了不少有关RxJava的文章,都会提到 一定要记得在生命周期结束的地方取消订阅事件,防止RxJava可能会引起的内存泄漏问题。...在子类使用Observable中的compose操作符,调用,完成Observable发布的事件和当前的组件绑定,实现生命周期同步。

    75820

    当Excel不够用的时候如何用Python救场?

    Excel是很多公司非常流行的工具,数据分析师和数据科学家经常发现他们把它作为数据分析和可视化工具的一部分,但这并不总是最好的选择。...尤其是在数据量很大的时候,Excel容易让我们无法使用其他应用程序,而且有些报告需要30分钟甚至几个小时才能完成刷新。是的,Excel喜欢把我们的电脑当人质! 显然需要做点什么。...我们在这些问题上浪费了太多的时间,几乎没有时间去做任何实际的分析或预测。幸运的是,Python及其操作CSV文件的工具可以帮助我们优化数据处理流程。下面给大家介绍常用的套路。...清理数据 使用Python中的pandas模块,您可以非常轻松和有效地操作和分析数据。毫无疑问,这是我拥有的最有价值的工具之一。...在我的例子中,我使用它连接到Netsuite并使用SQL查询提取数据。

    1.5K10

    当说到网站建设的时候,我们都在谈论什么?

    新万云企业网站作为网站品牌营销专家,长久以来一直为企业提供全网营销场景的内容覆盖,助力企业通过多渠道展示企业的生产力。 那平时在谈网站建设的时候,到底是从哪几个方面去考虑打造网站呢?...office-notes-notepad-entrepreneur-thumb.jpg 二、网站类型选择 新万云企业网站专业销售人员在与客户洽谈时,大多数情况下企业并不是会直接说“我想要一个电商型网站”...、“我想做一个会员服务型网站”等,而是直接给出一个精确的需求: “我需要一个能带来订单转化的网站”; “我需要一个可以会员注册增强黏性的网站”; “我需要一个品牌展示来让客户加盟的网站”; 其实这亦是客户对于网站类型的需求化...三、抓住定位,塑造品牌 除了选择好网站建设中的网站类型,还需针对企业定位打造适合的企业网站。...更有现在火爆市场的小程序,占据10亿微信用户的市场,多重流量入口,为手机减负的轻量级应用,直击客户痛点,扩大品牌影响力。

    52840

    git pull 代码的时候默认使用 rebase 而不是 merge

    一般 merge 的情况下会产生一个新的提交名字为 Merge branch ****,如下图所示: 这个新的提交会导致提交记录中产生多余的提交信息,实际与解决问题相关的提交不符而且对于一些洁癖来说这种难以接受...,所以 git 提供了一个 rebase 的方式来替代 merge,rebase 可以按顺序结构重新整合提交顺序而不是产生一个新的提交。...具体的区别大家可到网络上搜索一下这里重点不是介绍他们两个的区别。...而如果你希望每次拉代码的时候不需要执行 git fetch 后再执行一次 git rebase,而是像以前一样直接执行 git pull 而是使用 rebase 来合并代码的话,那以下命令可以帮到你。...git config --global pull.rebase true 执行次命令后,每次 git pull 都将是一个 git fetch + git rebase 的过程了,而不是以前的那种方式。

    1.3K20

    git pull 代码的时候默认使用 rebase 而不是 merge

    一般 merge 的情况下会产生一个新的提交名字为 Merge branch ****,如下图所示: 这个新的提交会导致提交记录中产生多余的提交信息,实际与解决问题相关的提交不符而且对于一些洁癖来说这种难以接受...,所以 git 提供了一个 rebase 的方式来替代 merge,rebase 可以按顺序结构重新整合提交顺序而不是产生一个新的提交。...具体的区别大家可到网络上搜索一下这里重点不是介绍他们两个的区别。...而如果你希望每次拉代码的时候不需要执行 git fetch 后再执行一次 git rebase,而是像以前一样直接执行 git pull 而是使用 rebase 来合并代码的话,那以下命令可以帮到你。...git config --global pull.rebase true 执行次命令后,每次 git pull 都将是一个 git fetch + git rebase 的过程了,而不是以前的那种方式。

    1.3K20

    程序员硬核劝告:现在还不是出门的时候

    但疫情开始的时候,人们肯定控制不住自己的流动,所以将该参数值调回0.99,即: public static float u=0.99f; 此时,让我们看下疫情扩散情况。 ?...一开始的时候,由于潜伏期的关系,很难再人群中发现患者并进行隔离。 等潜伏期一过,就会出现前一阵子的那般爆发性的增长。而此时,医院隔离区的床位也会被占满。...,要出门去参加婚礼了 可现在还不是出门的时候,疫情仍旧处于爆发期。...尤其是最近几天,立春已至,各地天气都在转好,往往会给人一种疫情没什么大碍的错觉。 可放松警惕的时候往往是最危险的时候,国家防控措施进入常态化,最后对疫情产生主导作用的,其实还是我们每个人。...在视频的结尾,他引用了《三体》中的一句话,再次提醒大家: “无知和弱小不是生存的最大障碍,傲慢才是。”

    24810

    css属性transparent有时候并不是透明的

    两天前我发了个求助,今天终于在朋友的帮助下找到了答案,关于transparent以及rgba(0,0,0,0),在webkit与没有抗锯齿的浏览器下对border渲染正常,但是在有抗锯齿渲染的浏览器下(...这个例子在webkit下两条透明的表框表现是没任何问题的,但是在FF下面,border与border的那个对角线位置,明显多出了一条黑线,如图。...所以为了让浏览器渲染一样,以后大家写border透明色的时候,必须写相邻border相同颜色的透明,比如上面的例子: border-top: 100px solid transparent; border-left...solid #eee; 就要改成 border-top: 100px solid rgba(238,238,238,0); border-left: 100px solid #eee; 也就是说,在某些时候...,border的透明处理不要简单的写为transparent。

    1.1K80

    当妈妈在淘宝购物的时候,都发生了什么?(下篇)

    当你妈妈看到琳琅满目裙子的时候,手中的鼠标不断点击着,当点开一款商品“今夏爆款碎花裙子”的时候,首先通过你家电脑和淘宝服务器之间的连接获取到了碎花裙子的详细信息,然后在浏览器上面展现出来。...扣款成功的消息返回到淘宝服务器,淘宝服务器这时候才通知你购买成功!这个时候最高兴的当然是你妈妈了,你爸爸看了一眼自己的银行卡,一声叹息。 ?...为了表达自己的喜爱,妈妈登录到淘宝网并且给了碎花裙子一个好评,这个好评也同样被淘宝服务器记录住了,当其他阿姨看到这个碎花裙子,你妈妈的好评就会被她们看到了。 ?...过了不知道多久,你妈妈再次上网购物,当她点开淘宝网站的时候,发现网页上有“猜你喜欢,给您推荐”等栏目,里面也是一些美丽的裙子或者与裙子可以互相搭配的鞋子,这是怎么做到的??...当妈妈在购物的时候,都发生了什么?现在是不是比较清楚了。

    73040

    当看裸体的时候,卷积神经网络会看到什么

    当卷积神经网络遇到一个充满皮肤的物体时,它往往会趋向于预测“NSFW”,这会导致在丽娜的身体出现大块的红色区域。...为了建立右边的热力图,我们系统地挡住部分原始图像并报告1 减去“NSFW”平均得分(即“SFW”分数)。当大部分NSFW地区被阻挡的时候,“SFW”分数增加,我们看到更高的热图中的值。...需要澄清的是,下面这些图包含什么样的图片被送入卷积神经网络的例子,对于上面两个实验的每一个: 一个关于闭塞实验的好处是他们可能会展现当分类器是一个完全的黑箱。...【……】 这个过程类似于返回一个强烈的激活的属性(而不是普通的梯度),即,用强烈激活计算 ,其中Xn 是特征映射的元素, 输入图像的位置。...这突出了训练基于规则的分类器与现代人工智能研究的根本的区别。我们重新设计训练数据直到已发现的功能得到改善,而不是重新设计我们的功能。

    90260
    领券