寄生式继承是在原型式继承对象基础上直接添加属性方法并返回增强对象的轻量模式;用object.create()创建基础对象,挂载实例或原型方法,封装为工厂函数,注意引用类型需单独初始化。

寄生式继承的核心就是在原型式继承得到的对象基础上,直接添加新方法或属性,再返回这个增强后的对象。它不依赖 class 或 extends,而是用函数封装整个过程,适合轻量、一次性、按需增强的场景。
先用原型式继承创建基础对象
寄生式继承必须基于一个已有对象。通常用 Object.create() 或自定义的原型继承函数来生成初始对象,确保新对象能访问原对象的属性和方法:
- 推荐用 Object.create(parent):简洁、语义清晰、ES5+ 原生支持
- 避免直接赋值
child.__proto__ = parent,不规范且兼容性差 - 不要用
new F()手动模拟(如旧式寄生写法),除非需兼容极老环境
在新对象上直接挂载方法
拿到继承来的对象后,就可自由扩展。所有新增方法都属于该实例(或其原型),不影响原始对象:
- 给对象本身加方法:
obj.sayHi = function() { ... } - 若希望多个实例共享方法,可挂到其原型上:
Object.getPrototypeOf(obj).log = function() { ... } - 注意 this 指向:方法内直接访问
this.name等自有属性或继承属性,无需额外绑定
封装成可复用的工厂函数
把继承 + 扩展逻辑收进一个函数,便于多次调用、传参定制:
- 函数接收原始对象(parent)和可选配置(如 name、level)
- 内部用
Object.create(parent)创建新对象 - 设置实例属性(
child.name = config.name) - 挂载方法(
child.clone = function() { return Object.create(this); }) - 返回增强后的对象
警惕引用类型共享问题
因为底层仍是原型继承,如果父对象含数组、对象等引用类型属性,所有寄生对象会共享同一份数据:
- 例如
parent.tags = ['a', 'b'],则child1.tags.push('c')会影响child2.tags - 解决办法:在工厂函数中为每个实例单独初始化引用属性,如
child.tags = [...parent.tags]或child.tags = [] - 这不是寄生式继承独有的问题,原型式、组合继承中同样存在
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











