JavaScript对象实例化与原型链是同一机制的两个侧面:new操作创建实例并设置__proto__指向构造函数的prototype,属性访问时沿__proto__链逐级查找直至null。

对象实例化过程和原型链是 JavaScript 中同一套机制的两个侧面:实例化时建立连接,原型链靠这个连接运行。
new 关键字触发的四步绑定
当你写 const obj = new Foo(),引擎实际完成:
- 创建一个空对象
- 把该对象的
__proto__指向Foo.prototype - 用这个新对象作为
this执行Foo函数体 - 返回该对象(除非构造函数显式返回另一个对象)
关键点在于第二步——__proto__ 的赋值,它直接把实例和原型对象连了起来,为后续查找铺好路。
属性访问时的原型链查找
一旦实例创建完成,每次读取属性(如 obj.method())都会触发查找流程:
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 先在
obj自身上找,有就返回 - 没有就顺着
obj.__proto__去Foo.prototype上找 - 还没找到,就继续查
Foo.prototype.__proto__(通常是Object.prototype) - 一直查到
null为止,找不到就返回undefined
这个逐级向上查找的过程,就是原型链在起作用。它不依赖实例化时的代码,而是靠每个对象身上那个 __proto__ 链路自动运转。
构造函数、prototype 和 __proto__ 的三角关系
三者不是并列概念,而是分工明确:
-
Foo是函数,它有prototype属性,指向一个普通对象(即原型对象) -
Foo.prototype是普通对象,它有constructor属性,指回Foo -
obj是实例,它没有prototype,但有__proto__,且obj.__proto__ === Foo.prototype
这种结构让所有 new Foo() 创建的实例共享 Foo.prototype 上的方法,又互不影响各自的数据属性。
内置类型也遵循同一规则
不只是自定义函数,所有内置构造器(Array、Date、Object)都走这套流程:
-
const arr = []等价于new Array(),所以arr.__proto__ === Array.prototype Array.prototype.__proto__ === Object.prototype-
Object.prototype.__proto__ === null,这是整个链的终点
因此,arr.toString() 能运行,是因为查找路径是:arr → Array.prototype → Object.prototype → 找到 toString。

















