JavaScript原型设计模式是语言底层运行逻辑的自然外显,以对象为模板复用,通过Object.create()或prototype实现,方法共享节省内存、支持运行时动态修改,但引用类型属性共享易致陷阱、原型链过长增加调试难度。

因为 JavaScript 从诞生起就不是“先有类、再造对象”,而是“先有对象、再复用对象”——原型设计模式不是 JS 的一个可选项,它是语言底层运行逻辑的自然外显。
它根植于语言的第一性原理
1995 年 Brendan Eich 用 10 天实现 JS 时,目标很明确:语法像 Java,但对象系统必须简单、动态、无需编译期定义。类系统需要理解“类→实例→继承链→访问控制”一整套抽象,而原型只需一个动作:找一个现成对象,克隆它,改几处。一个 { name: 'Alice' } 就是完整对象,不需要前置声明类、字段类型或构造函数。这种“所见即所得”的对象创建方式,让设计师、HTML 工程师也能快速上手。
它直接对应运行时的真实行为
JS 中所有对象都天然携带 [[Prototype]] 内部槽,方法调用不是靠“查类定义”,而是沿着这条链向上委托查找。你写 obj.toString(),引擎做的就是:obj → obj.__proto__ → obj.__proto__.__proto__ …… 直到找到或抵达 null。这种机制不依赖编译、不预设结构,允许你在运行中:
- 给 Array.prototype 加个 .chunk(),所有数组立刻可用
- 用 Object.setPrototypeOf(obj, newProto) 动态切换行为
- 用 Object.create(null) 创建完全干净的对象,避免原型污染
它让复用更轻、更自由
类继承强调“是什么”(is-a),原型继承关注“能做什么”(can-do)。你不必为“会飞+会游泳+会叫”的鸭子建一个新类,只需把 Flyable.prototype、Swimmable.prototype 和 Quackable.prototype 的方法,按需挂到某个对象的原型链上。ES6 class 虽然提供了熟悉的语法,但 B.prototype.__proto__ === A.prototype 这条链依然真实存在,instanceof 判断、super 调用、甚至 Vue 响应式依赖收集,全靠这条链运转。
它天生适配 JS 的性能与哲学
方法只存一份,在原型对象上;所有实例共享,内存开销小。创建对象不用执行构造函数(除非必要),Object.create(Person.prototype) 比 new Person() 更轻量——尤其当构造函数含副作用或复杂初始化时。这也是为什么库如 Lodash 的 _.clone、Vue 的响应式代理、甚至 React Fiber 的节点复用,都隐式依赖原型的可克隆性与可委托性。
不复杂,但容易忽略:你每天写的每个对象、每次点操作符、每个 for...in 遍历,背后都是原型模式在 quietly work。


















