借用构造函数继承能解决原型链中引用属性共享问题,因其在子类构造函数中调用父类构造函数并绑定this至新实例,使每个实例拥有独立引用属性;而原型链继承因子类prototype指向父类实例,导致所有子实例共用同一引用内存地址。

借用构造函数继承(也叫“伪造对象”或“经典继承”)能有效解决原型链继承中引用类型属性被所有实例共享的问题——核心在于让父类构造函数在子类内部执行,且 this 指向新创建的子类实例,从而为每个实例独立初始化引用属性。
为什么原型链继承会导致引用属性共享
当通过 Sub.prototype = new Super() 设置原型时,父类实例作为子类原型,其内部的数组、对象等引用属性会被所有子类实例共用。修改其中一个实例的 arr.push(1),其他实例也会看到变化。
借用构造函数的基本写法
在子类构造函数中,用 call 或 apply 调用父类构造函数,把当前子类实例(this)传进去:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- function Super() { this.colors = ['red', 'blue']; }
- function Sub() { Super.call(this); } // 关键:每次 new Sub 都执行一次 Super,生成独立 colors 数组
- const a = new Sub(); const b = new Sub(); a.colors.push('green'); console.log(b.colors); // ['red','blue'] —— 不受影响
结合原型链实现方法复用
单纯借用构造函数无法复用父类方法(每次都在构造函数里重新创建),所以通常搭配原型链使用:
- 用借用构造函数继承属性(尤其是引用类型)
- 用原型链继承方法(把方法定义在父类 prototype 上)
- 例如:
Sub.prototype = Object.create(Super.prototype); Sub.prototype.constructor = Sub;
注意 constructor 指针和 instanceof 的问题
直接赋值 Sub.prototype = Super.prototype 会破坏继承关系;必须用 Object.create(Super.prototype) 创建干净原型对象,并手动修复 constructor。否则 new Sub() instanceof Super 可能为 false,且 instance.constructor 指向错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










