原型链赋值是new四步流程中的第二步,紧接在创建空对象之后、执行构造函数之前,即设置新对象的[[Prototype]]指向构造函数的prototype。

new 绑定过程中,原型链的赋值不是附加操作,而是创建实例时同步完成的核心步骤——新对象的 [[Prototype]](即 __proto__)被直接设为构造函数的 prototype 对象。
原型链赋值发生在哪一步?
它紧接在“创建空对象”之后、“执行构造函数”之前,是 new 四步流程中的第二步:
- 第1步:创建空对象
{}(堆内存中分配新空间) - 第2步:设置
obj.__proto__ = Constructor.prototype - 第3步:以该对象为
this执行构造函数 - 第4步:按返回值规则决定最终返回谁
为什么必须是 Constructor.prototype,而不是 Constructor?
因为 prototype 是函数对象上专用于存放共享属性和方法的对象;Constructor 本身是函数,不是原型对象。写成 obj.__proto__ = Constructor 会导致原型链断裂,实例无法访问 Constructor.prototype 上的方法。
等效的手动写法是:Object.create(Constructor.prototype),它内部正是做了这一步赋值。
赋值后发生了什么变化?
这个赋值动作建立了实例与原型之间的隐式连接,带来两个关键结果:
- 实例可通过
__proto__向上查找到Constructor.prototype,再顺着它的__proto__找到Object.prototype,最终到null - 所有定义在
Constructor.prototype上的属性和方法(如sayHi、toString),对实例而言“可访问但不可枚举”,实际存储位置不在实例自身
常见误解澄清
很多人把 constructor 属性当作原型链的一部分,其实不是:
-
Constructor.prototype.constructor默认指向Constructor,只是个普通属性,可被修改或删除 - 修改它不影响原型查找机制——即使
Person.prototype.constructor = null,new Person()的实例依然能正常调用Person.prototype上的方法 - 原型链查找只依赖
__proto__链,不看constructor

















