new调用函数时执行四步:创建继承自构造函数prototype的空对象;以该对象为this执行函数体,若显式返回对象则返回它,否则返回新对象;设置新对象[[Prototype]]为构造函数prototype;最终返回该对象或显式返回的对象。

当用 new 调用一个函数时,JavaScript 会创建一个新对象,并让这个对象成为函数执行时的 this。这不是简单的“绑定”,而是一套明确的四步操作。
第一步:创建空对象
引擎内部生成一个全新的普通对象(即 {}),它继承自该构造函数的 prototype 属性所指向的对象。
例如:
function Person(name) { this.name = name; }const p = new Person('Alice');
此时,p.__proto__ === Person.prototype 为 true。
立即学习“Java免费学习笔记(深入)”;
第二步:绑定 this 并执行函数体
将上一步创建的对象作为 this,调用构造函数;函数体内对 this 的所有属性赋值,都会写入这个新对象。
关键点:
- 如果构造函数显式返回一个对象(包括数组、函数、正则等引用类型),则
new表达式最终返回该对象; - 如果返回原始值(
string/number/boolean/null/undefined)或未返回,则忽略返回值,仍返回第一步创建的新对象。
第三步:设置原型链
新对象的 [[Prototype]](可通过 __proto__ 访问)被设为构造函数的 prototype。这是实现原型继承的基础。
注意:Person.prototype.constructor === Person 是默认行为,但可被手动修改或覆盖。
第四步:返回新对象(或显式返回的对象)
除非构造函数返回一个对象,否则 new 总是返回新创建的对象。这个返回值就是整个 new 表达式的值。
常见误区:
-
return this;是多余的,因为默认就返回它; -
return 42;或return 'hello';不影响结果,仍返回新实例; -
return {};或return new Date();则会覆盖默认返回值。
不复杂但容易忽略。


















