new绑定原型链是在创建对象瞬间由引擎隐式设置的,即空对象诞生时其[[Prototype]]槽就被设为Fn.prototype,早于构造函数执行;this即此已带原型的对象,故能天然沿原型链查找方法;constructor属性不影响原型链,手动修改__proto__或改动prototype.constructor均不改变该机制;new的第二步——设置__proto__指向Fn.prototype——是原型链生效的唯一来源。

new 绑定时,原型链不是靠构造函数里操作 this 建立的,而是由 JavaScript 引擎在创建对象那一瞬间就隐式设置好的——这一步早于构造函数执行,也独立于函数体内的任何代码。
原型链在 new 的第一步就被确定
执行 new Fn() 时,引擎首先生成一个空对象,但这个对象从诞生起就自带正确的原型连接:
- 它的内部
[[Prototype]]槽(即对外暴露的__proto__)被直接设为Fn.prototype - 等效于手动调用
Object.create(Fn.prototype),而不是先{}再补obj.__proto__ = Fn.prototype - 这个关联发生在构造函数执行前,
this就是这个已带好原型的对象,二者同步出现
构造函数执行时 this 已具备查找能力
因为新对象的 __proto__ 已指向 Fn.prototype,所以函数体内对 this 的访问天然能沿原型链向上查找:
-
this.sayHi()先查实例自身,没找到就顺着this.__proto__去Fn.prototype找 -
Fn.prototype上的方法、属性(包括toString等内置方法)全部可被继承 -
constructor属性只是默认附带,删掉或改写它不影响原型链本身
整个过程不依赖 constructor 或手动赋值
原型链的建立完全由 new 内部机制保证,和以下操作无关:
立即学习“Java免费学习笔记(深入)”;
- 你在构造函数里写
this.__proto__ = ...不会改变new原始设定(还可能破坏继承) -
Fn.prototype.constructor是否等于Fn,不影响实例能否访问原型上的方法 - 箭头函数没有
prototype,也不能被new调用,自然不触发这套流程
new 的四步中,原型绑定是第二步且不可跳过
标准执行流程为:
- 创建空对象(堆内存分配)
- 设置该对象的
__proto__指向构造函数的prototype - 以该对象为
this执行构造函数 - 按返回值规则决定最终返回谁
其中第二步是原型链生效的唯一来源,缺了它,实例就无法共享方法,new 就失去了面向对象的意义。


















