构造函数和普通函数无语法本质区别,均为function类型;区别仅在于调用方式:加new时this指向新对象、默认返回该对象,不加new时this指向调用上下文、返回值由return决定。

构造函数和普通函数在 JavaScript 中没有语法上的本质区别,它们都是 function 类型,底层都继承自 Function.prototype。真正区分它们的,是调用方式和使用意图,而不是定义形式。
关键区分点:调用方式决定角色
同一个函数,既可当普通函数调用,也能当构造函数使用:
- 加 new 调用 → this 指向新创建的空对象,函数扮演构造函数
- 不加 new 直接调用 → this 指向调用上下文(非严格模式下可能是 window),函数就是普通函数
例如:
function Person(name) {<br> this.name = name;<br>}<br><br>const p1 = new Person('Alice'); // 构造函数调用 → p1 是实例<br>const p2 = Person('Bob'); // 普通函数调用 → this 指向全局,name 被挂到 window 上(非严格模式)
命名约定是人为约定,不是强制规则
首字母大写(如 Person、Car)只是开发约定,用来提示使用者“这个函数预期配合 new 使用”。但 JS 引擎不会校验——你完全可以写 function apple() {} 然后 new apple(),它照样能当构造函数用;反之,function User() {} 若不加 new 直接调用,它就只是普通函数。
所以命名只是协作信号,不是技术边界。
行为差异主要体现在 this 和返回值
使用 new 时,JS 引擎会自动执行四步(即 new 的底层逻辑):
- 创建一个空对象
{} - 将该对象的
__proto__指向构造函数的prototype - 把构造函数内的
this绑定到这个新对象 - 若构造函数没有显式返回对象,则默认返回这个新对象
而普通函数调用时:
– this 取决于谁调用(隐式绑定、call/apply 显式绑定等)
– 返回值完全由 return 语句决定,无隐式返回
实际开发中怎么快速判断
看三点即可:
-
是否出现在 new 后面:如
new Date()、new Array()、new MyComponent()→ 构造函数 - 函数体内是否大量使用 this.xxx = xxx:这是构造实例属性的典型写法
- 是否期望生成多个具有相同结构的对象:比如一批用户、一组 DOM 元素管理器 → 适合用构造函数
如果函数只做计算、格式化、事件回调或封装逻辑,基本就是普通函数。


















