new绑定分四步:先创建空对象,再链接原型,然后以该对象为this执行构造函数体,最后判断返回值;构造函数内代码按顺序执行,this动态绑定到新实例,原型方法不参与构造过程。

new 绑定过程中,构造函数的逻辑是按明确步骤逐层展开的,不是简单“调用函数”就完事。核心在于:new 操作触发一套内置机制,构造函数体内的代码只在其中第三步才开始执行。
new 操作的四步底层流程
当你写 new Person('Alice', 25) 时,JavaScript 引擎内部会严格按以下顺序执行:
- 创建一个全新的空对象(即实例)
- 将该对象的 __proto__ 指向 Person.prototype(建立原型链)
- 以这个新对象为 this,逐行执行 Person 函数体内的代码(此时才真正运行你写的逻辑)
- 判断返回值:若函数显式返回一个对象,则返回该对象;否则默认返回步骤1创建的那个新对象
构造函数体内代码的执行顺序
一旦进入第3步,函数体就像普通函数一样从上到下执行,但所有 this.xxx = ... 都会绑定到刚创建的新实例上。例如:
function Person(name) {
console.log('step 1: 开始执行');
this.name = name;
console.log('step 2: this.name 已赋值为', this.name);
this.say = function() { return 'Hi'; };
console.log('step 3: 方法已挂载');
}
输出顺序就是:step 1 → step 2 → step 3,中间任何对 this 的操作都实时作用于新实例。
注意 this 不是提前绑定,而是动态注入
构造函数里的 this 并非函数定义时就确定,而是在 new 执行到第3步时,由引擎**临时注入并绑定**到新对象上。这意味着:
- 如果在构造函数里调用其他函数(如 this.init()),init 内部的 this 也指向该实例
- 若用箭头函数或普通函数调用方式绕过 new(如 Person()),this 会指向全局或 undefined(严格模式),导致属性挂错位置
- 构造函数中不能用 return this 来“确保返回”,因为 this 就是默认返回值,显式 return 对象才会覆盖它
原型方法不参与构造过程
像 Person.prototype.walk = function(){...} 这类定义,发生在构造函数外部,与 new 执行无关。它们不会在每次 new 时重复执行,而是被所有实例共享访问——只有当实例真正调用 person.walk() 时,才去原型链上查找并执行。











