new调用构造函数时this指向新实例,因其执行四步:创建空对象、链接原型、以该对象为this调用构造函数、返回新对象;普通调用时this不指向实例,非严格模式下指向全局对象,严格模式下为undefined;箭头函数无prototype且无this,不能用new调用。

当使用 new 关键字调用构造函数时,JavaScript 引擎会自动创建一个新对象,并把该对象赋给函数内部的 this——所以此时 this 指向的就是这个新实例。
new 执行时的四步关键操作
理解 this 的指向,本质是理解 new 的执行机制。它实际做了以下四件事:
- 创建一个全新的空对象(即新实例)
- 将该对象的
[[Prototype]]链接到构造函数的prototype对象上 - 以这个新对象为
this,调用构造函数(即函数体内的this就是它) - 若构造函数没有显式返回对象,则默认返回这个新对象
为什么普通调用时 this 不是指向新实例
如果不加 new 直接调用构造函数(比如 Person('Alice')),函数就只是普通函数调用,this 会根据执行环境决定:在非严格模式下指向全局对象(如 window 或 global),严格模式下为 undefined。这时不会创建实例,也不会绑定原型链,this 和“新实例”毫无关系。
可以手动模拟 new 的行为来验证 this 的来源
下面是一个简易版 myNew,能清晰看到 this 是如何被绑定到新对象上的:
function myNew(ctor, ...args) {
const obj = {}; // 步骤1:新建空对象
Object.setPrototypeOf(obj, ctor.prototype); // 步骤2:设置原型
const result = ctor.apply(obj, args); // 步骤3:this 绑定为 obj 并执行
return (result !== null && typeof result === 'object') ? result : obj; // 步骤4:返回
}
注意 ctor.apply(obj, args) 这一行:正是通过 apply 显式把 this 设为 obj,才让构造函数内部的 this 指向了新实例。
箭头函数不能用作构造函数的原因
箭头函数没有自己的 this,也不具备 prototype 属性,更不能通过 new 调用。尝试 new (() => {}) 会直接抛出 TypeError。这是因为 new 要求目标必须有可访问的原型用于设置实例继承链,而箭头函数不满足这一前提。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











