new绑定通过创建新对象并设为this值确保构造函数上下文指向实例,其四步机制包括:创建空对象、绑定this、执行函数体、按返回值决定最终结果。

JavaScript 中 new 绑定通过创建新对象并将其设为函数调用时的 this 值,来保证构造函数执行上下文指向该实例。
new 操作符的四步执行机制
当使用 new Constructor() 时,引擎内部严格按以下顺序执行:
- 创建一个全新的空对象(继承自
Constructor.prototype) - 将该对象绑定为构造函数调用时的
this值(即this = 新对象) - 执行构造函数体,所有对
this的属性赋值都发生在新对象上 - 若构造函数显式返回一个非
null的对象,则返回该对象;否则默认返回新创建的对象
原型链与 this 的关联不可绕过
new 绑定不是靠“修改已有函数的 this”实现的,而是通过控制函数调用方式,让引擎在进入执行上下文前就确定 this 值。这个 this 是执行上下文的固有组成部分,且在函数体内无法被 call/apply 覆盖(除非手动重绑定,但此时已脱离 new 场景)。
例如:
立即学习“Java免费学习笔记(深入)”;
function Person(name) {
this.name = name; // this 指向 new 出的实例
}
const p = new Person('Alice');
console.log(p.name); // 'Alice'
console.log(p.__proto__ === Person.prototype); // true
与普通调用、call/apply 的本质区别
new 不是语法糖,而是一种独立的调用模式,拥有专属的执行上下文初始化逻辑:
- 普通调用:
this指向全局(非严格)或undefined(严格) -
func.call(obj, ...):临时将this设为obj,不创建新对象、不设置原型 -
new func():强制启用构造器模式,this 必然指向新实例,且原型自动链接
箭头函数无法被 new 调用的原因
箭头函数没有自己的 [[Construct]] 内部方法,也没有 prototype 属性。试图 new () => {} 会直接抛出 TypeError。这反向印证了 new 绑定依赖函数的构造器能力——只有具有 [[Construct]] 的函数(即普通函数、class)才能参与该绑定过程。


















