new操作符执行时自动完成原型连接,即把新对象的[[Prototype]]指向构造函数的prototype,该过程在构造函数执行前由引擎强制完成,不可阻止或绕过。

JavaScript 中 new 操作符执行时,会自动完成构造函数原型与新对象的连接,这个过程不是手动赋值,而是通过内部属性 [[Prototype]] 实现的。
new 操作的四个关键步骤(含原型连接)
当你写 const obj = new Foo(),JS 引擎实际做了以下事:
- 创建一个空对象(即
{}) - 将该对象的内部
[[Prototype]]链接到Foo.prototype - 以该对象为
this执行Foo构造函数 - 若构造函数返回对象,则返回该对象;否则返回第一步创建的对象
其中第二步就是原型连接的核心:引擎直接设置新对象的隐式原型,等价于在语言内部执行了类似 obj.[[Prototype]] = Foo.prototype(注意这不是可写的 JS 语法,而是规范中的内部操作)。
如何验证原型已正确连接
你可以用标准方法检查连接是否生效:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
obj.__proto__ === Foo.prototype→ 返回true(__proto__是非标准但广泛支持的访问方式) -
Object.getPrototypeOf(obj) === Foo.prototype→ 更规范的写法,推荐 -
obj instanceof Foo→ 返回true,因为instanceof就是基于原型链查找Foo.prototype
原型连接不依赖构造函数体内代码
这个连接发生在 new 调用的初始化阶段,在构造函数体执行之前就已完成。也就是说:
- 即使你在
Foo函数里没写任何代码,new Foo()创建的对象依然能访问Foo.prototype上的方法 - 你不能在构造函数里“阻止”这个连接,它由
new机制强制保证 - 如果手动在构造函数中返回一个对象,原型连接仍发生过,只是最终返回值覆盖了默认对象
手写 new 的简易实现(体现原型连接)
下面是一个简化版 myNew,突出原型赋值这一步:
function myNew(constructor, ...args) {
const obj = {}; // 步骤1:创建空对象
Object.setPrototypeOf(obj, constructor.prototype); // 步骤2:显式设置原型(核心)
const result = constructor.apply(obj, args); // 步骤3:绑定 this 并执行
return (result !== null && typeof result === 'object') ? result : obj; // 步骤4
}
这里 Object.setPrototypeOf(obj, constructor.prototype) 就是在模拟内置 [[Prototype]] 的连接动作。现代引擎虽不依赖此 API 实现,但它准确表达了原理。

















