不写 new 调用构造函数时,this 指向全局对象(非严格模式)或 undefined(严格模式),导致属性挂载全局、方法无法继承或抛出 typeerror;应使用 new.target 判断调用方式,箭头函数不能作为构造函数。

不写 new 调用构造函数时,this 指向全局对象(非严格模式)或 undefined(严格模式),而不是你期待的新实例。这会导致属性意外挂到全局、方法无法继承,甚至引发静默错误。
非严格模式下:this 指向 window 或 global
浏览器中直接调用 Person("Alice", 30)(没加 new),函数内部的 this 就是 window:
-
this.name = "Alice"实际等价于window.name = "Alice" - 全局变量被污染,可能覆盖已有属性(比如
window.name原本就有用途) - 实例无法访问构造函数
prototype上的方法,因为原型链根本没建立
严格模式下:this 是 undefined
如果函数顶部写了 "use strict",或整个脚本/模块处于严格模式,this 直接为 undefined:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
this.name = "Alice"会抛出TypeError: Cannot set property 'name' of undefined - 错误立刻暴露,反而比非严格模式更容易发现问题
为什么不能靠 this 判断是否用了 new?
单纯检查 this 类型不可靠,因为:
- 非严格模式下
this是window,但window instanceof Person是false,可用来识别 - 更稳妥的方式是用
new.target:它在用new调用时为构造函数本身,否则为undefined - 常见防护写法:
if (!new.target) throw new Error("请用 new 调用")
箭头函数和普通函数的区别
箭头函数根本不能当构造函数——它没有 prototype,且不绑定 this,直接 new ArrowFn() 就报错。所以这个问题只适用于传统 function 声明的构造函数。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










