new调用函数时自动将新对象的[[Prototype]]设为该函数的prototype;执行四步:创建空对象、链接原型、以对象为this执行函数、按返回值决定最终结果。

当你用 new 调用一个函数时,JavaScript 会自动完成原型链的连接:新对象的 [[Prototype]](即 __proto__)被设为该函数的 prototype 对象。
new 操作符的四步执行逻辑
每次执行 new Foo(),引擎内部按顺序做四件事:
- 创建一个空的普通对象(即实例)
- 将该对象的
[[Prototype]]链接到Foo.prototype - 以该对象为
this,执行Foo函数体 - 若函数显式返回一个对象,则返回它;否则返回刚创建的对象
原型链连接的关键在于 prototype 属性
Foo.prototype 是函数对象独有的属性,默认是一个普通对象,且自带 constructor 指回 Foo。这个对象就是所有 new Foo() 实例的原型基准。
例如:
立即学习“Java免费学习笔记(深入)”;
function Person(name) { this.name = name; }
const p = new Person('Alice');
console.log(p.__proto__ === Person.prototype); // true
console.log(Person.prototype.constructor === Person); // true
手动修改 prototype 会影响所有后续实例
只要在 new 调用前修改了函数的 prototype,新实例就会继承更新后的原型对象:
- 可以赋值一个新对象:
Person.prototype = { say() { return 'Hi'; } }; - 也可以用
Object.setPrototypeOf()或__proto__修改已有实例,但这不改变后续new的行为 - 注意:重写
prototype后,constructor会丢失,需手动补上
箭头函数不能用 new,也没有 prototype 属性
箭头函数没有 prototype 属性,调用 new 会直接抛出 TypeError。这是因为箭头函数被设计为不作为构造器使用,其 this 绑定也由外层决定,不参与 new 绑定流程。
尝试 new (() => {}) 会报错,而普通函数即使为空,也能被 new 调用并生成实例。


















