new绑定与原型链是一体两面的同步过程:引擎创建新对象的同时将其设为this,并自动设置其[[prototype]]指向构造函数的prototype,二者不可分割,共同构成实例-原型关系的基础。

new 绑定后的实例,其原型对象与 this 的关联不是“事后设置”,而是一体两面的同步过程:this 指向新对象的同时,该对象的 [[Prototype]] 就已被设为构造函数的 prototype。
这个关联是 JavaScript 引擎在 new 执行时自动完成的,不需要手动干预,也不依赖于构造函数内部代码。
this 是什么?它从哪来?
- 当执行
new Person('Alice')时,引擎第一步就创建一个空对象(比如{}); - 这个空对象立刻成为构造函数
Person内部this的值; - 所有
this.xxx = yyy的赋值,都直接写进这个对象里——它就是实例本身。
所以,
this不是变量,也不是引用,而是那个新生实例的“代称”;你对this做的任何操作,就是在操作那个即将返回的对象。
原型对象怎么连上去的?
-
在
this被绑定之后、构造函数执行之前或同时,引擎会执行关键一步:新对象.__proto__ = 构造函数.prototype
这等价于设置内部属性
[[Prototype]],让实例能顺着原型链查找方法和属性;它和
this的绑定发生在同一轮 new 操作中,不可分割。
举例:
function Person(name) { this.name = name; } Person.prototype.sayHi = function() { return 'Hi!'; }; const p = new Person('Alice');此时:
p.name来自this.name = name(实例自有属性);p.sayHi()能调用,是因为p.__proto__ === Person.prototype为 true,查找到原型上的方法。
为什么不能靠 constructor 属性反推原型?
-
p.constructor默认指向Person,但它只是Person.prototype.constructor的一个属性,可被改写; - 原型链查找不看
constructor,只看[[Prototype]]链; - 即使你删掉或改写
Person.prototype.constructor,p.sayHi()依然有效。
换句话说:
this的落点对象 → 实例数据的容器;[[Prototype]]的指向 → 方法共享的通道;- 二者由 new 一次性确立,共同构成“实例-原型”关系的基础。
如果构造函数返回对象,this 还有用吗?
- 有,但仅限于函数体内部;
- 如果构造函数显式
return { x: 1 },new 表达式最终返回的是这个对象,而不是最初创建的那个this对象; - 此时,原始
this被丢弃,原型链也不会设到返回的对象上(除非你手动设置); - 所以:只有默认返回(无 return 或返回原始值)时,this 和原型链才完整协同。
不复杂但容易忽略。











