寄生组合继承通过object.create(animal.prototype)构建原型链,避免父构造函数重复执行和实例属性冗余;手动修正constructor指向,并在子类构造函数中用call注入实例属性,确保引用类型独立且方法可沿原型链访问。

寄生组合继承优化原型链的核心,在于精准构建子类与父类之间的原型关系,既复用父类原型方法,又避免冗余执行父构造函数、防止引用属性共享,同时保持 constructor 指向正确。
用 Object.create 替代 new 父类实例
这是最关键的一步。传统组合继承中写 Dog.prototype = new Animal(),会导致父构造函数被调用两次,并在子类原型上留下无意义的实例属性(比如 name、hobbies)。寄生组合继承改用:
-
Dog.prototype = Object.create(Animal.prototype)—— 只建立原型链连接,不触发父构造函数 - 这样子类原型干净,只继承方法,不带多余实例数据
- 所有子实例的方法调用仍能沿原型链向上找到
Animal.prototype.speak
手动修复 constructor 指向
Object.create 创建的新对象,其 constructor 默认指向父类。如果不修正,dog.constructor === Animal 就会出错:
- 补上
Dog.prototype.constructor = Dog - 确保
new Dog()实例的 constructor 正确反映自身类型 - 这对 instanceof 判断、序列化、框架识别等场景很重要
实例属性靠 call/apply 单次注入
子类构造函数中,只在实例化时调用一次父构造函数,把需要隔离的属性(尤其是引用类型)绑定到当前实例:
-
Animal.call(this, name)—— 确保每个dog1、dog2都有独立的hobbies数组 - 避免原型链继承带来的引用共享问题(比如 push 后影响其他实例)
- 父类原型上的方法(如
speak)依然可通过原型链访问,无需重复定义
不拷贝、不遍历,维持原生原型链结构
常见错误是用 Object.assign(Dog.prototype, Animal.prototype) 或循环赋值,这会破坏原型链:
- 方法变成自有属性,无法动态响应父类原型后期扩展
- 丢失不可枚举方法(如
toString、valueOf) - 内存占用上升,失去原型复用优势
- 正确做法就是让
Dog.prototype.__proto__ === Animal.prototype,靠浏览器原生链式查找
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











