寄生组合继承通过object.create(parent.prototype)建立原型链、child.prototype.constructor=child修正构造器、parent.call(this)初始化实例属性,实现方法可继承可覆盖、实例属性隔离、constructor指向正确,从而天然支持多态。

寄生组合继承本身不直接“实现多态”,但它为多态提供了干净、可靠的原型链基础——只有方法能正确继承并被子类覆盖,多态才自然成立。所谓“完美”,关键在于避免属性共享、不重复调用父构造函数、保持 constructor 指向正确、且子类能自由重写或扩展父类方法。
确保方法真正可继承且可覆盖
父类方法必须定义在 prototype 上,而不是构造函数内;子类原型必须准确指向父类原型,而非父类实例。
- 错误写法:
Child.prototype = new Parent()—— 触发父构造函数,可能污染原型、产生冗余属性 - 正确写法:
Child.prototype = Object.create(Parent.prototype)—— 只建立原型链连接,无副作用 - 务必补上:
Child.prototype.constructor = Child,否则instance.constructor会指向 Parent
让实例属性隔离,同时支持传参
子类构造函数中用 Parent.call(this, ...args) 初始化自身实例属性,既复用父逻辑,又保证每个实例独享引用类型(如数组、对象)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:父类
Animal(name)中this.name = name和this.skills = [] - 子类
Dog(name, breed)调用Animal.call(this, name),再设this.breed = breed - 这样每个
Dog实例的skills是独立数组,不会互相影响
多态落地:子类重写方法 + super 调用(ES6 兼容写法)
寄生组合继承下,instance.method() 会按原型链查找:先找子类原型,找不到再往上。这就天然支持运行时动态分发(即多态)。
- 子类可完全重写父方法:
Dog.prototype.speak = function() { console.log(this.name + ' barks!'); } - 也可选择性增强:
Dog.prototype.speak = function() { Animal.prototype.speak.call(this); console.log('...and wags tail'); } - 若用 ES6 class 编写,
super.speak()本质就是编译后自动做了上述Animal.prototype.speak.call(this)
验证是否“完美”:三件事缺一不可
一个健康的寄生组合继承结构,应同时满足:
-
child instanceof Parent返回true -
child.constructor === Child(不是 Parent) - 调用
child.speak()执行的是子类版本,而child.__proto__.__proto__.speak仍保留父类原始方法(便于复用)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










