构造函数必须用 new 显式调用,否则仅为普通函数调用;new 触发四步构造流程,不加 new 会导致 this 指向错误、无实例创建及原型链断裂。

JS 中构造函数没有“隐式调用”这一说法——这是常见误解。所谓“隐式调用”,其实是对 普通函数被误当构造函数使用,或 this 绑定机制被自动触发 的模糊描述。真正规范、可操作的只有显式调用(即用 new),而“不加 new”的调用本质上就是普通函数调用,不是构造函数调用。
构造函数必须用 new 显式调用
构造函数本身只是首字母大写的普通函数,它不会因命名而自动获得特殊行为。只有通过 new 关键字调用时,JavaScript 引擎才会启动四步构造流程:
- 创建一个全新的空对象
- 将该对象的
__proto__指向构造函数的prototype - 将函数内部的
this绑定到这个新对象 - 默认返回该新对象(除非显式 return 一个非 null 对象)
不加 new 调用构造函数 = 普通函数调用
如果写 Person("张三", 25)(没 new),它就和 sayHello() 完全等价:
-
this指向全局对象(非严格模式)或undefined(严格模式) - 不会创建实例,也不会建立原型链连接
- 属性会意外挂到全局(如
this.name = "张三"→window.name) - 容易引发静默错误,且难以调试
为什么有人觉得存在“隐式调用”?
这种说法通常源于两类混淆:
-
类语法的错觉:ES6 class 的
constructor看似自动运行,但底层仍是new触发;class A {}实际仍需new A() -
this 隐式绑定的干扰:比如
obj.method()中this自动指向obj,但这属于方法调用规则,与构造无关
如何避免误用?
实践上可主动防御:
- 在构造函数开头加校验:
if (!(this instanceof Person)) throw new Error('请使用 new 调用') - 启用严格模式(
"use strict"),让this在无 new 时为undefined,更快暴露问题 - 现代开发中优先使用 class + new,语义更清晰;或用工厂函数替代(返回对象,不依赖 new)











