object.create实现纯净继承的核心是切断构造函数副作用、避免状态共享、明确原型指向;它通过创建空对象并直接指向parent.prototype来复用方法,再手动修复constructor,子类构造函数中用parent.call(this)显式调用父类初始化逻辑。

原型链结合 Object.create 实现“纯净继承”,核心在于**切断构造函数执行副作用、避免共享实例状态、明确原型指向**。它不靠 new Parent() 创建中间实例,而是直接让子类原型对象的 [[Prototype]] 指向父类的 prototype,从而干净地复用方法,又互不干扰数据。
为什么不用 Child.prototype = new Parent()
这种写法会让所有子类实例共享同一个父类实例的属性(比如数组、对象),造成意外的数据污染。例如:
- 父类有
this.items = [],多个子类实例调用push()会往同一个数组里塞数据; - 构造函数中执行的初始化逻辑(如发请求、改全局状态)会在设置原型时被重复执行,毫无必要。
Object.create(Parent.prototype) 的正确用法
这一步是建立原型链的关键:创建一个空对象,其 __proto__ 直接指向 Parent.prototype,既复用了父类方法,又没执行父构造函数。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 必须手动修复
constructor:否则Child.prototype.constructor会指向Parent; - 写法示例:
Child.prototype = Object.create(Parent.prototype);<br>Child.prototype.constructor = Child;
- 后续在
Child.prototype上添加子类独有方法,它们自然挂在该原型对象上,不会影响父类。
子类构造函数里怎么调用父类逻辑
原型链只管方法查找,构造函数的初始化仍需显式处理。ES6 class 中的 super() 底层就是调用 Parent.call(this, ...args)。
- 子类构造函数中,用
Parent.call(this, ...args)绑定this并运行父类初始化逻辑; - 确保父类构造函数不依赖
new的上下文(即不要在内部用new.target做强校验),否则可能报错; - 如果父类构造函数返回对象,
call结果可能被覆盖,需谨慎设计。
避免踩坑的细节
看似简单,但几个细节常被忽略:
-
Object.create(null)不是继承用的——它生成无原型对象,连toString都没有,适合做纯字典; - 别直接改
__proto__,性能差且非标准;Object.setPrototypeOf()是替代方案,但仅用于动态调整,不该用于初始化继承; - 属性赋值永远写在当前对象上:哪怕原型上有同名属性,
child.x = 1也只是给child自己加个自有属性,不会修改原型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










