原型式继承通过共享原型对象实现复用,不依赖构造函数和new;object.create()是其标准实现,创建新对象并设置[[prototype]]指向源对象,利用委托机制查找属性,适合配置派生与轻量复用,但存在引用类型共享陷阱。

JavaScript 的原型式继承,本质是通过共享原型对象来实现属性和方法的复用,不依赖构造函数,也不涉及 new 操作;而 Object.create() 是 ES5 提供的标准方法,正是这种继承模式最直接、最干净的实现工具。
原型式继承的核心:基于空对象 + 原型委托
原型式继承不关心“类”或“实例化”,只关注“一个对象如何以另一个对象为原型”。它的关键在于:
- 创建一个新对象,其内部
[[Prototype]](即__proto__)指向指定的源对象; - 新对象访问属性时,若自身没有,就沿着原型链向上查找——这就是委托机制;
- 源对象充当“父模板”,新对象可自由扩展自有属性,互不影响。
Object.create() 就是原型式继承的官方封装
它接收两个参数:第一个是作为原型的对象(必需),第二个是属性描述符对象(可选,用于定义新对象自身的属性)。例如:
const parent = { name: 'A' };const child = Object.create(parent, { age: { value: 25, writable: true } });console.log(child.name); // 'A'(从 parent 委托获取)console.log(child.age); // 25(自身属性)
这行代码等价于手动设置原型:
const child = {};child.__proto__ = parent;Object.defineProperty(child, 'age', { value: 25, writable: true });
但 Object.create() 更安全、更标准,避免了直接操作 __proto__ 的兼容性和性能问题。
与构造函数继承的区别:无 this 绑定,无执行上下文
构造函数模式(如 function Person() {})在 new Person() 时会绑定 this、执行函数体、隐式返回实例;而原型式继承不做任何执行,只是建立原型链接。它适合:
- 从已有对象快速派生配置对象(如组件默认配置 + 用户覆盖);
- 实现轻量级对象复用,避免定义函数和 new 实例的开销;
- 构建纯粹的数据模板或行为共享层(比如一组通用工具方法对象)。
注意:浅拷贝语义与引用陷阱
原型式继承不复制属性值,只是共享引用。如果原型对象中包含数组、对象等引用类型:
const base = { list: [] };const a = Object.create(base);const b = Object.create(base);a.list.push(1);console.log(b.list); // [1] ← 被意外修改!
这是因为 a.list 和 b.list 都指向同一个数组。需要深拷贝或在子对象中重新初始化引用属性,才能避免干扰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











