javascript原型式继承通过object.create()让新对象的[[prototype]]直接指向已有对象实现属性方法复用,不依赖构造函数或class,核心是对象间委托关系,适合轻量动态场景但需警惕共享引用类型数据。

JavaScript 中原型式继承创建新对象,核心是让新对象的 __proto__(或内部 [[Prototype]])直接指向一个已有对象,从而复用其属性和方法。它不依赖构造函数,也不涉及 class 或 extends,而是纯粹基于对象到对象的委托关系。
用 Object.create() 创建继承自指定对象的新对象
这是最标准、最推荐的方式。该方法接收一个对象作为参数,返回一个新对象,其内部原型([[Prototype]])就是传入的对象。
-
Object.create(proto):创建一个新对象,proto成为其原型 -
Object.create(proto, propertiesObject):第二个参数可额外定义自有属性(带描述符)
示例:
const animal = {
species: 'unknown',
speak() { console.log(`${this.name} makes a sound`); }
};
const dog = Object.create(animal);
dog.name = 'Buddy';
dog.breed = 'Golden';
console.log(dog.species); // 'unknown' ← 来自 animal 原型
dog.speak(); // 'Buddy makes a sound' ← 调用原型上的方法
手动设置 __proto__(不推荐,仅作理解)
某些旧环境或调试中可能看到直接赋值 __proto__ 的写法,但它不是标准用法,且已被 Object.setPrototypeOf() 取代,性能也较差。
- 不建议:
const obj = {}; obj.__proto__ = animal; - 更规范的替代:
Object.setPrototypeOf(obj, animal);
注意:__proto__ 是非标准但广泛支持的访问器;Object.setPrototypeOf() 是标准方法,但会改变对象的内部结构,影响优化,应避免在热路径频繁调用。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
与构造函数继承的区别
原型式继承关注的是「对象复用」,而非「类型建模」:
- 不使用
function构造器,也不需要new - 新对象没有自己的构造函数概念,
dog.constructor === Object(除非显式修正) - 所有共享数据(尤其是引用类型)都位于原型上,修改会影响所有继承它的对象
例如,若 animal.hobbies = [],那么 dog.hobbies.push('barking') 会导致所有从 animal 继承的对象看到这个变化——这是原型式继承的典型特征,也是需警惕的地方。
实际应用场景
适合轻量、动态、一次性或配置驱动的对象扩展:
- 为某个配置对象添加默认行为:
const prodConfig = Object.create(defaultConfig); - 实现组件/模块的简易行为委托(如插件系统)
- 测试中快速模拟具有某组方法的对象,无需完整类定义
不适合需要独立状态、多层级类型约束或构造时初始化参数的场景——那种情况更适合构造函数继承或 ES6 class。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










