原型式继承不复制对象,而是通过object.create()让新对象[[prototype]]指向原对象实现属性共享;它建立委托链而非数据副本,修改原型引用类型属性会影响所有继承者。

JavaScript 中原型式继承本身不直接“复制对象”,而是通过让新对象的 [[Prototype]] 指向已有对象,从而实现属性和方法的共享与复用。所谓“复制”其实是创建一个继承自原对象的新对象,它自身不包含原对象的属性(除非显式赋值),但能访问原对象的可枚举/不可枚举属性(取决于继承方式)。
用 Object.create() 创建原型继承对象
这是最标准、推荐的方式。它接受一个对象作为新对象的原型,并可选地添加自有属性描述符。
-
基础用法:直接传入源对象,返回一个新对象,其
__proto__指向该源对象 - 不拷贝属性值:新对象自身没有自有属性,所有读取都委托到原型链上;修改原型上的引用类型属性会影响所有继承者
- 示例:
const parent = { name: 'Alice', skills: ['JS'] };
const child = Object.create(parent);
console.log(child.name); // 'Alice'(从原型读取)
console.log(child.hasOwnProperty('name')); // false
child.age = 25;
console.log(child.age); // 25(自有属性)
console.log(child.skills.push('React')); // 影响 parent.skills
手动设置 prototype 链(不推荐,仅理解原理)
早期模拟方式,如用空函数作中介,再替换其 prototype,现已基本被 Object.create() 取代。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 需定义构造函数,再改写其
prototype,步骤繁琐且易出错 - 无法直接继承普通对象(必须是“构造函数产出”的实例)
- 现代代码中应避免使用
注意:这不是深拷贝或浅拷贝
原型式继承不是数据复制操作,而是一种关系建立机制。它不产生属性值的副本,只建立委托链。
- 若需真正复制属性值(尤其是嵌套对象/数组),应使用
structuredClone()、展开运算符或JSON.parse(JSON.stringify())(有局限) - 若目标是“复用行为 + 独立状态”,建议组合使用
Object.create()和初始化逻辑(如在构造函数中重置引用类型) - 例如:为避免共用
skills数组,可在创建后手动赋值:child.skills = [...parent.skills]
ES6 class 与原型继承的关系
class 语法是原型继承的语法糖。extends 实际仍基于 Object.setPrototypeOf() 或 Object.create() 设置原型链。
-
class Child extends Parent创建的实例,其原型链最终指向Parent.prototype - 它继承的是构造函数的
prototype,而非任意对象——这点区别于Object.create(obj) - 因此,想让普通对象被“继承”,仍需
Object.create()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










