借用构造函数继承使子类实例拥有独立的引用类型属性,通过在子类构造函数中用call/apply调用父类构造函数,将属性直接赋给this;但不继承父类原型方法,常与原型链结合成组合继承。

借用构造函数继承通过在子类构造函数中调用父类构造函数(用 call 或 apply),把父类内部的属性直接“复制”到每个子类实例上,从而让每个实例拥有自己独立的引用类型副本。
关键点在于:属性不再挂在原型链上,而是写在 this 上。
比如父类里定义了:
function Parent(name) {
this.name = name;
this.hobbies = ['reading', 'swimming']; // 引用类型
}
如果用原型链继承,hobbies 是 Parent 实例的自有属性,而 Child.prototype = new Parent() 会让所有子类实例共享这个数组。改一个,全跟着变。
但借用构造函数继承是这样写的:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function Child(name, age) {
Parent.call(this, name); // 关键:每次 new Child 时都执行一次 Parent 初始化
this.age = age;
}
这时:
- 每次创建
Child实例,都会重新执行Parent构造函数; -
this指向当前Child实例,所以this.hobbies = [...]是给该实例单独分配一个新数组; - 不同实例的
hobbies数组内存地址不同,互不影响。
效果示例:
const c1 = new Child('Alice');
const c2 = new Child('Bob');
c1.hobbies.push('coding');
console.log(c1.hobbies); // ['reading', 'swimming', 'coding']
console.log(c2.hobbies); // ['reading', 'swimming'] ← 完全不受影响
它解决共享问题的逻辑链条很清晰:
- 原型链继承 → 共享父类实例 → 引用类型属性被多个子实例共用
- 借用构造函数 → 每个子实例各自运行父类构造逻辑 → 各自生成独立的引用类型值
注意:
- 这种方式只继承父类构造函数里定义在
this上的属性和方法; - 父类原型上的方法(如
Parent.prototype.sayName)不会被继承; - 每个实例都会重复创建构造函数内的函数(如
this.eat = function(){}),有内存开销。
所以它常和原型链搭配使用,组成“组合继承”,兼顾属性隔离与方法复用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










