原型链是JavaScript属性访问与继承的唯一执行路径,严格遵循“自身→原型→…→Object.prototype→null”查找规则,支撑所有继承形式、定义对象共享机制并划定行为边界。

原型链是 JavaScript 对象属性模型的底层骨架,不是可选机制,而是整个属性访问与继承行为的唯一执行路径。
它是属性查找的唯一依据
JavaScript 中任何对象属性或方法的访问,都严格遵循“自身 → 原型 → 原型的原型 → … → Object.prototype → null”这条单向链路。没有例外,也没有绕过方式:
- 即使使用点号(
obj.prop)或方括号(obj['prop']),引擎内部都走同一套原型链查找逻辑 -
in操作符、for...in循环、Object.keys()等行为,也都依赖原型链的可枚举性与结构层次 - 就连
toString()、valueOf()这类基础方法,也是从Object.prototype沿链继承而来
它定义了对象间共享与复用的本质
原型链让“共享”成为默认设计,而非额外功能:
- 构造函数的
prototype对象,就是所有实例共用的属性/方法容器 - 数组的
push、字符串的slice、正则的test等内置方法,全部通过原型链挂载在对应构造函数的prototype上 - 修改
Array.prototype可让所有数组实例立即获得新能力(如添加last()),这是原型链直接暴露的可操作性
它支撑所有继承形式的底层实现
无论是传统构造函数、ES6 class,还是 Object.create() 或 Object.setPrototypeOf(),最终都归结为设置对象的 [[Prototype]] 内部槽(即 __proto__ 或 Object.getPrototypeOf() 所指向的对象):
立即学习“Java免费学习笔记(深入)”;
-
class B extends A实际生成的仍是B.prototype.__proto__ === A.prototype的链式关系 -
Object.create(parent)直接把parent设为新对象的原型,一步构建链起点 - 哪怕使用
Reflect.setPrototypeOf()动态改写,也只是在运行时调整链中某一环的指向
它决定了对象行为的边界与兼容性
原型链的终点 Object.prototype 和终结值 null,划定了 JavaScript 对象能力的绝对上限:
- 所有普通对象最终都继承自
Object.prototype,因此天然拥有hasOwnProperty、isPrototypeOf等方法 - 若手动切断链(如
Object.create(null)),对象就不再有默认方法,变成“纯字典”,也失去toString等基础能力 - 浏览器环境中的 DOM 元素、Promise 实例等,其原型链虽延伸至宿主特有对象,但最终仍汇入
Object.prototype,保证基础语义统一


















