原型链是javascript运行时统一的对象属性查找机制,既支撑类式继承又适配函数式组合,所有对象和函数共享同一委托链,不绑定特定编程范式。

JavaScript 中原型链本身不是函数式编程的机制,也不直接属于面向对象编程(OOP)的“类”体系——它其实是两者之间实际运行时的共用底层结构。它的桥梁作用,体现在既支撑了模拟类的继承行为,又为高阶函数、闭包与对象组合提供了统一的对象模型基础。
原型链让构造函数具备“类”的表象
ES6 的 class 是语法糖,编译后仍是基于 prototype 和 __proto__ 的链接逻辑。比如:
- 定义
class Animal { speak() { ... } },底层等价于在Animal.prototype上挂方法; - 实例
const dog = new Animal()的dog.__proto__指向Animal.prototype; - 这种链式委托,使开发者能写出类似 Java 的继承写法,却无需编译期类型系统。
原型链天然适配函数式组合与代理模式
函数式编程强调不可变、纯函数和组合,而原型链不强制修改对象,只提供查找路径——这恰好支持:
- 用
Object.create(null)创建无内置方法的干净对象,作为纯数据容器; - 通过
Object.setPrototypeOf(obj, proto)动态挂载行为,实现运行时策略切换; - 结合高阶函数,例如
withLogger(obj)可返回一个新对象,其原型指向带日志方法的共享原型,而非污染原对象。
所有函数和对象共享同一套查找规则
无论你写的是普通函数、箭头函数、类方法,还是手动创建的对象,属性访问都走同一条路径:
- 先查自身属性;
- 再沿
[[Prototype]]链向上找(obj.__proto__ → obj.constructor.prototype → Object.prototype → null); - 这意味着
map、filter等数组方法,和你自定义的validate()方法,在引擎眼里没有本质区别——都是从某个原型对象上取出来的可调用值。
它让两种范式不必割裂设计
真实项目中,你常会混合使用:
- 用类封装状态(如
class ApiClient),但把请求逻辑抽成纯函数(formatUrl、parseResponse); - 这些纯函数可以挂在原型上供实例复用,也可以独立导入调用;
- 原型链不干预你的选择——它只是确保:当你写
client.send(),引擎知道该去哪里找这个函数,不管它是定义在类里、手动加在 prototype 上,还是通过Object.assign混入的。
不复杂但容易忽略:原型链不是为某一种编程风格服务的,而是 JavaScript 运行时对“对象怎么找东西”这一问题的统一回答。理解它,才能自由切换函数式抽象与面向对象组织,而不被语法表象牵着走。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











