原型式继承基于object.create()实现对象间浅拷贝复用,不涉及构造函数,无类型关系;原型链继承通过构造函数与prototype链接构建类式继承结构,支持方法复用和instanceof判断。

原型式继承和原型链继承听起来相似,但本质不同:前者是基于已有对象直接创建新对象的浅拷贝方式,后者是通过构造函数与原型配合实现类型间的继承关系。
原型式继承的核心是 Object.create()
它不涉及构造函数,只用一个现有对象作为新对象的原型:
- 语法简洁:
const child = Object.create(parent); - 新对象的
__proto__直接指向parent,没有中间构造函数层 - 适合“对象复用”场景,比如配置对象继承、临时扩展某个实例
- 所有引用属性仍被共享——和原型链继承一样,这是浅拷贝的固有局限
原型链继承依赖构造函数与 prototype 链接
它构建的是“类式”继承结构,目标是让子类型能复用父类型的原型方法:
- 典型写法:
Child.prototype = new Parent(); - 子实例通过
__proto__→Child.prototype→Parent.prototype→Object.prototype形成完整查找链 - 天然支持方法复用,但父类构造函数中的实例属性(如
this.name)会被所有子实例共享 - 必须配合
constructor修复,否则child.constructor会指向Parent
关键区别在设计意图和使用层级
原型式继承面向对象实例,是“以对象为蓝本”的即时复制;原型链继承面向类型系统,是“以构造函数为单位”的结构化继承:
- 原型式继承不产生新类型,
child instanceof Parent为false - 原型链继承明确建立类型关系,
child instanceof Parent为true - 前者常用于库内部对象委托(如 lodash 的
_.create),后者是传统 OOP 模拟的基础 - ES6 的
class底层仍是原型链继承,不是原型式继承
实际选型建议
不需要类型识别、只是临时借用属性时,用 Object.create() 更轻量;需要方法复用、类型判断、或后续扩展子类逻辑时,原型链继承(或其现代变体如寄生组合式继承)更合适。











