原型继承通过对象委托实现方法与属性共享,避免重复创建;方法应定义在构造函数prototype上,object.create()支持无构造函数继承,es6 class本质仍是原型机制,修改原型可统一更新所有实例。

原型继承能显著提升代码重用度,核心在于让多个对象共享同一份方法和属性,而不是各自重复创建。它不依赖“类”的抽象,而是通过对象间的委托关系实现复用——一个对象找不到某个属性时,自动向它的原型对象查找。
把通用方法挂到 prototype 上
构造函数内部定义方法会导致每个实例都生成一份新函数,浪费内存;而把方法写在 Constructor.prototype 上,所有实例共用同一个函数引用。
- 错误写法(重复创建):
this.sayHello = function() { ... }; - 正确写法(集中复用):
Person.prototype.sayHello = function() { ... }; - 验证复用效果:
a.sayHello === b.sayHello返回true
用 Object.create() 直接委托原型
不需要构造函数也能复用,适合纯数据对象或配置对象之间的继承。直接以现有对象为原型创建新对象,新对象自动获得原型上的所有能力。
-
const rabbit = Object.create(animal);—— rabbit 继承 animal 的eats和walk - 可叠加自有属性:
rabbit.jumps = true;,不影响原型共享逻辑 - 适用于轻量级对象复用、配置继承、组件默认行为扩展等场景
ES6 class 是语法糖,复用逻辑没变
class 看起来像传统面向对象,但底层仍是原型机制。所有实例方法都自动添加到类的 prototype 上,静态方法挂载在类本身。
-
class Animal { speak() { ... } }→Animal.prototype.speak存在 -
extends实际设置子类prototype.__proto__指向父类prototype - 因此
super调用的本质,就是沿着 [[Prototype]] 链向上找方法
避免重复定义,统一维护入口
当业务逻辑变更时,只需修改原型上的方法,所有实例立即生效。这比遍历每个对象手动更新更安全、更高效。
- 例如修改格式化日期逻辑:只改
DateUtils.prototype.format一处 - 新增校验规则:加到
Validator.prototype.isValidEmail即可全局可用 - 不依赖构建工具或打包流程,原生 JavaScript 即可落地











