构造函数是首字母大写、配合new调用的普通函数,本质无特殊语法;new执行分四步:创建空对象、设置原型链、绑定this并执行构造函数、按规则返回;方法应定义在prototype上以共享内存;手写new需用Object.create模拟原型连接并处理返回值。

构造函数本身不是特殊语法,而是普通函数加约定用法。高效回答的关键是:说清本质、讲准 new 的四步、点明原型链作用、顺便带出性能考量。
先说清楚构造函数到底是什么
它就是一个首字母大写、配合 new 调用的普通函数。没有编译器检查,不强制,纯靠约定。重点在于它的用途——批量创建结构一致的对象。比如:
- 命名规范:Person、Array、Date 都是构造函数,首字母大写是行业共识
- 调用方式:必须用 new,否则 this 指向会错(非严格模式下是全局对象)
- 本质没区别:function Person() {} 和 function person() {} 语法上完全一样,只是用法不同
new 执行过程必须分四步讲清楚
这是高频考点,不能笼统说“创建对象”,要拆解每一步的作用和影响:
- 第一步:创建空对象,比如 const obj = {}
- 第二步:连接原型链,执行 Object.setPrototypeOf(obj, Constructor.prototype),这步让实例能访问原型上的方法
- 第三步:绑定并执行,用 Constructor.call(obj, ...args),此时 this 就指向新对象,属性赋值生效
- 第四步:按规则返回:没 return → 返回 obj;return 基本类型 → 忽略,仍返 obj;return 引用类型 → 直接返回那个对象
顺带解释为什么方法要放在 prototype 上
如果每次都在构造函数里写 this.sayHi = function(){},每个实例都会拷贝一份函数,浪费内存。而写在 Constructor.prototype.sayHi 上,所有实例共享同一个函数,靠原型链查找。面试官听到这里,基本就认可你理解了设计意图。
可以补充一句手写 new 的思路(加分项)
用 Object.create(fn.prototype) 创建带正确原型的对象,再 call 绑定执行,最后判断返回值类型。不需要背代码,讲清逻辑就行——比如“返回值是对象才用它,否则用我们自己造的那个空对象”。


















