原型链是javascript继承的执行基础,负责运行时属性查找:对象通过__proto__逐级向上查找属性,直至object.prototype(其__proto__为null);所有继承模式最终都依赖该链实现方法访问,es6 class本质仍是其语法包装。

原型链是 JavaScript 原型继承设计模式的运行基础,不是附加机制,而是整个继承行为得以发生的根本路径。它不负责“定义”继承关系,而是承担“执行时属性查找”的实际工作——所有基于原型的继承方式(如原型链继承、组合式继承、寄生组合式继承等),最终都依赖原型链完成方法和属性的动态访问。
原型链构成继承关系的物理通路
在继承设计中,构造函数之间本身没有父子关系;真正建立“子类能用父类方法”这一能力的,是人为设置的原型链接。例如:
- 将 Child.prototype = new Parent(),就让 Child 的所有实例通过
__proto__指向一个 Parent 实例,而该实例的__proto__又指向Parent.prototype; - 这样就形成了一条可追溯的链:实例 → Child.prototype → Parent 实例 → Parent.prototype → Object.prototype → null;
- 当调用
child.sayName()时,引擎正是沿着这条链逐级查找,直到在Parent.prototype上命中方法。
不同继承模式对原型链的构建策略不同
原型链本身是通用机制,但具体怎么搭、搭几层、是否复用实例,决定了继承模式的特性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
原型链继承:直接用
new Parent()赋值给Child.prototype,链短但引发引用属性共享问题; -
借用构造函数 + 原型链混合:用
call复制实例属性,再用原型链挂载方法,避免共享,但父类方法无法复用; -
寄生组合式继承:用
Object.create(Parent.prototype)构建干净的 Child.prototype,既切断实例属性干扰,又完整保留原型链查找能力,是目前最推荐的链式搭建方式。
原型链终点决定行为边界
所有原型链最终都必须终止于 Object.prototype,其 __proto__ 为 null。这个终点不是约定,而是硬性限制:
- 如果中途某环节的
__proto__被设为undefined或非对象值,链会提前中断,导致属性查找失败; - 自定义构造函数若未显式设置
constructor,虽不影响链式查找,但会丢失构造器引用,影响instanceof和调试可读性; - ES6
class的extends本质仍是设置这条链——B.prototype.__proto__ === A.prototype,只是语法自动保障了链的完整性与安全性。
原型链不可见但必须可控
开发者无法直接修改对象的内部 [[Prototype]],但可通过标准 API 精确干预链结构:
-
Object.setPrototypeOf(obj, proto):动态重置对象原型(慎用,性能敏感); -
Object.create(proto, descriptors):创建新对象并指定其[[Prototype]],是构建干净原型链的首选; -
Reflect.getPrototypeOf(obj)和Reflect.setPrototypeOf():提供更规范的操作接口; - 避免使用非标准的
__proto__赋值,尤其在生产环境,因其行为在严格模式下可能被禁用。
原型链不是黑盒,它是 JavaScript 继承设计中唯一真实生效的执行路径。理解它如何被构建、如何被查找、如何被终止,才能真正掌控各种继承模式的底层表现和潜在缺陷。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










