new绑定与原型链是同一过程的两个不可分割侧面:new创建实例时既将this绑定至新对象,又将其[[Prototype]]设为Constructor.prototype,二者缺一不可。

new 绑定和原型链不是两个独立机制,而是同一过程的两个不可分割的侧面:new 创建实例的同时,就完成了 this 的绑定和原型链的建立。
new 绑定的核心:this 指向新对象
执行 new Constructor(args) 时,JavaScript 引擎首先创建一个空对象,并把这个对象作为构造函数调用时的 this 值。这个动作发生在构造函数体执行之前,是隐式的、自动的。
- 构造函数内所有
this.xxx = yyy都直接写入这个新对象,形成实例自有属性 - 不需要手动用
call或apply绑定 this —— new 已经替你做了 - 如果构造函数显式返回一个非 null 对象,new 的结果就取这个返回值;否则返回新创建的对象
原型链的建立:__proto__ 指向 prototype
在绑定 this 的同时,引擎会把新对象的内部 [[Prototype]](即 __proto__)设为 Constructor.prototype。
- 等效于:
obj.__proto__ = Constructor.prototype - 这不是赋值给
Constructor本身,而是它的prototype属性所指向的对象 -
Object.create(Constructor.prototype)是手动模拟这一步的标准方式
二者协同:数据隔离 + 方法共享
单独存在任一环节都会导致对象行为异常:
立即学习“Java免费学习笔记(深入)”;
- 只有 new 绑定、没设置原型链 → 实例无法访问
Constructor.prototype上的方法(比如toString或自定义方法) - 只有原型链、没 new 绑定 → 构造函数里的
this.name = 'xxx'没地方落,实例属性根本不会初始化 - 典型表现:
const p = new Person('Alice')后,p.name来自 this 绑定,p.sayHi()来自原型链查找
常见误区提醒
容易混淆的点其实都源于对“绑定”和“链接”这两个动作的理解偏差:
-
constructor属性只是原型对象上的一个回指(Person.prototype.constructor === Person),可被修改,不影响原型查找 -
__proto__是历史兼容写法,标准获取方式是Object.getPrototypeOf(obj) - 箭头函数没有
prototype,不能被 new 调用,否则直接报错


















