寄生组合继承通过object.create(parent.prototype)建立纯净原型链,避免父类构造函数执行和实例属性污染,再手动修正constructor指向子类,同时在子类构造函数中调用parent.call(this)初始化实例属性,实现属性与方法的完全分离。

寄生组合继承完善原型链的核心,是让子类原型干净、准确地指向父类原型,同时不触发父类构造函数,也不污染原型对象。
用 Object.create 建立纯净原型链
直接赋值 Child.prototype = new Parent() 会执行父类构造逻辑,在原型上留下无意义的实例属性(比如 this.name = 'xxx' 或 this.hobbies = [])。而 Object.create(Parent.prototype) 只设置 __proto__ 指向,不调用构造函数,确保原型对象“空但有链”。
- 它创建的新对象,其内部 [[Prototype]] 直接关联 Parent.prototype
- 子类实例查找方法时,能顺着这条链正确到达父类原型
- 避免了引用类型属性在原型上被多个实例共享的风险
手动修正 constructor 指向
Object.create 后,Child.prototype.constructor 会指向 Parent,这会影响 instanceof 判断和调试可读性。必须显式重置:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Child.prototype.constructor = Child;- 这不会影响原型链本身,但让实例的 constructor 属性回归本意
- ES6 class 编译后也会自动做这一步,本质一致
实例属性与原型方法分离明确
寄生组合继承要求两步配合使用,缺一不可:
- 在子类构造函数内调用
Parent.call(this, ...args)—— 负责初始化独立的实例属性 - 在构造函数定义之后调用原型链设置(如
Child.prototype = Object.create(Parent.prototype))—— 负责复用原型方法 - 这样既保证每个实例拥有自己的
hobbies数组,又能共用speak()方法
兼容旧环境可用中转函数替代
若需支持没有 Object.create 的老浏览器(如 IE8),可用空函数中转:
const F = function() {};F.prototype = Parent.prototype;Child.prototype = new F();- 再补上
Child.prototype.constructor = Child; - 效果等价,原理仍是切断构造调用、只传递原型引用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










