JavaScript中原型式继承怎么写?它有什么应用场景?

作者:袖梨 2026-07-08
原型式继承以现有对象为模板,通过Object.create()创建新对象并建立委托关系,实现行为复用而非实例复制,适用于配置派生、轻量实体系统等场景。

原型式继承不依赖构造函数,直接以一个现有对象为模板,创建出新对象并建立委托关系。它写法简洁,核心是 Object.create()

怎么写?

最简写法只有一行:

const parent = { name: 'Base', skills: ['JS'] };<br>const child = Object.create(parent);<br>child.name = 'Derived'; // 自身属性<br>child.skills.push('React'); // 注意:引用类型仍共享

关键点:

  • Object.create(obj) 创建一个新对象,其 [[Prototype]] 直接指向 obj
  • 新对象不执行任何构造函数,没有 constructor 自动绑定(如需可手动设)
  • 所有属性查找都委托给原对象,实现“行为复用”而非“实例复制”

适用场景

它适合轻量、数据驱动、无需类抽象的场合,尤其当“对象即配置”或“对象即模板”时:

立即学习“Java免费学习笔记(深入)”;

  • 配置对象派生:一个基础配置对象(如 API 地址、超时时间),通过 Object.create(baseConfig) 快速生成 dev / prod / test 等变体,各自覆盖部分字段,其余自动继承
  • 游戏或实体系统中的轻量委托:比如 entity 对象定义通用方法(update()render()),player = Object.create(entity)enemy = Object.create(entity) 各自添加专属逻辑,共享底层行为
  • 避免深拷贝开销的临时扩展:想临时给某个对象加一组方法,又不想污染原对象或重复创建函数,可用 Object.create(templateWithMethods)
  • 快速构建原型链实验或测试桩:在调试或单元测试中,快速模拟具有特定原型关系的对象结构,无需定义完整构造函数体系

注意什么?

它不是万能替代,有明确边界:

  • 引用类型(数组、对象)仍会共享——和原型链继承一样,这不是 bug,而是委托机制的自然表现
  • 不支持向“父对象”传参初始化,因为没构造函数调用环节
  • 不适合需要严格类型识别(如 instanceof)的场景;它产出的是普通对象,不是某构造函数的实例

相关文章

精彩推荐