new操作符第二步自动将新对象的__proto__指向构造函数的prototype,这是引擎原生行为,确保原型链查找正常,且不可手动模拟。

这是 new 操作符内部自动完成的一步,不是代码显式赋值的结果,也不依赖开发者手动设置。
new 执行时的第二步就是建立这个连接
当你写 const obj = new Foo(),JavaScript 引擎在底层会严格按顺序执行四件事,其中第二步就是:
- 把新创建的空对象的
__proto__属性,指向Foo.prototype - 这个动作是引擎原生行为,发生在构造函数执行之前
- 它确保了后续属性查找能沿着
obj → Foo.prototype → Object.prototype → null这条链进行
__proto__ 的值由谁决定?
一个对象的 __proto__ 始终等于**创建它的构造函数的 prototype**:
-
new Array()→ 实例的__proto__指向Array.prototype -
new Date()→ 实例的__proto__指向Date.prototype -
const o = {}(等价于new Object())→o.__proto__指向Object.prototype
可以验证,但不能靠它来“实现”
你写 console.log(obj.__proto__ === Foo.prototype) 会输出 true,但这只是结果,不是原因。不要试图用 obj.__proto__ = ... 来模拟 new 的行为——它虽在部分环境中可用,但不符合规范,且无法触发内部原型链初始化逻辑(比如 constructor 绑定、内置方法可访问性等)。
class 语法下也一样
ES6 的 class 是语法糖,new MyClass() 后实例的 __proto__ 依然指向 MyClass.prototype。class 内部仍基于 prototype 和 new 的原始机制运作,只是自动维护了 constructor 属性。











