new绑定时原型链由引擎在对象创建瞬间隐式设置,即obj.[[prototype]]直接指向fn.prototype,早于构造函数执行;this即该对象,故可沿原型链查找方法;constructor属性不影响继承机制。

new 绑定时,this 的原型链不是靠“赋值 this.__proto__”手动建立的,而是由引擎在创建对象阶段就隐式设置好的。这个关联发生在构造函数执行前,且只对新对象生效,和函数体内是否操作 this 无关。
原型链关联发生在第一步:对象创建时
当执行 new Fn(),引擎首先生成一个空对象(比如 {}),但这个对象不是普通空对象——它内部的 [[Prototype]] 槽(即对外暴露的 __proto__)被直接设为 Fn.prototype。
这一步等价于:
const obj = Object.create(Fn.prototype)- 而不是
const obj = {}后再补obj.__proto__ = Fn.prototype
也就是说,原型链关系在 new 的第一瞬间就已确定,早于 this 绑定和函数执行。
为什么 this 能访问到原型上的方法?
因为构造函数体内的 this 就是那个刚创建的对象,而该对象的 [[Prototype]] 已指向 Fn.prototype。所以当你写 this.sayHi(),JS 引擎会:
- 先在
this自身查找sayHi - 没找到,就顺着
this.__proto__ → Fn.prototype查找 - 如果
Fn.prototype.sayHi存在,就调用它
constructor 属性不是绑定关键,只是默认附带
Fn.prototype.constructor === Fn 是语言默认行为,但它不影响原型链本身。即使你删掉或改写 Fn.prototype.constructor,new Fn() 创建的对象依然能正确继承 Fn.prototype 上的方法。
真正起作用的是 obj.__proto__ === Fn.prototype 这个等式成立——它由 new 内部机制保证,不依赖 constructor。
常见误解澄清
- 不是“先有 this,再给 this 加原型”:this 就是那个带好原型的新对象,二者同步诞生
- 不是靠
this.__proto__ = ...实现:你在构造函数里改this.__proto__不影响 new 的原始绑定(但可能破坏继承) - 箭头函数、call/apply 等不触发 new 流程,自然也不会建立这套原型链











