new绑定的本质是创建新对象并将其设为构造函数的this,同时自动设置该对象的[[prototype]]指向构造函数的prototype,从而建立实例与原型的方法共享关系。

new 绑定和原型链是同一过程的两个侧面:new 的核心动作之一就是建立原型链,而原型链的起点正是 new 绑定 this 时所操作的那个新对象。
new 绑定的本质是 this 指向新对象
当执行 new Constructor(...args) 时,JavaScript 引擎会创建一个空对象,并把该对象作为构造函数调用时的 this 值。这一步不是“赋值”,而是隐式地将构造函数内部所有 this.xxx = yyy 写入这个新对象。
- 构造函数内对 this 的任何属性赋值,都直接落在新实例上(实例自有属性)
- this 的绑定发生在构造函数执行前,由 new 自动完成,无需手动 call/apply
- 若构造函数显式返回一个非 null 对象,this 绑定的结果会被丢弃,返回值替代新对象
原型链在 new 中被自动设置
new 不仅绑定 this,还同步设置新对象的内部 [[Prototype]](即 __proto__),使其指向 Constructor.prototype。这是原型链可访问的根基。
- 等效于:obj.__proto__ = Constructor.prototype
- 不能写成 obj.__proto__ = Constructor —— prototype 是函数的属性,Constructor 本身是函数,不是原型对象
- Object.create(Constructor.prototype) 是手动模拟这一步的标准方式
两者协同构成“实例-原型”关系
new 绑定让实例拥有自己的数据,原型链让实例能共享方法。二者缺一不可:
- 只有 new 绑定、无原型链 → 实例无法访问原型上的方法(如 toString、自定义 sayHi)
- 只有原型链、无 new 绑定 → 构造函数内 this 没落点,属性无法初始化到实例上
- 典型表现:const p = new Person('Alice') 之后,p.name 来自 this 绑定,p.sayHi() 来自原型链查找
常见误解澄清
容易混淆的是作用域链与原型链、this 绑定与 constructor 属性:
- constructor 不是原型链的一部分:Person.prototype.constructor 指回 Person,只是约定,可被修改,不影响原型查找
- __proto__ 不是标准属性:它是浏览器兼容写法,标准是 Object.getPrototypeOf(obj),但语义一致
- 箭头函数没有 prototype,不能被 new 调用;试图 new 箭头函数会直接抛错











