借用构造函数继承的核心是用call改变父类构造函数的this指向,使其将实例属性赋值到子类新实例上;它只继承实例属性,不继承原型方法,需配合原型链继承使用。

借用构造函数继承(也叫“经典继承”)的核心,就是让子类构造函数在执行时,用 call 改变父类构造函数内部的 this 指向,从而把父类的实例属性“复制”到子类新创建的实例上。
为什么用 call?
call 能立即调用函数,并显式指定 this 值和参数。在子构造函数里调用父构造函数时,把当前子实例(this)传给父构造函数,父函数里的 this.xxx = xxx 就会赋值到子实例上,而不是创建一个独立的父实例。
基本写法
看这个例子:
function Parent(name, age) {
this.name = name;
this.age = age;
this.colors = ['red', 'blue'];
}
function Child(name, age, job) {
// 关键:借用 Parent 构造函数
Parent.call(this, name, age); // ← this 指向新创建的 Child 实例
this.job = job;
}
const child1 = new Child('Alice', 25, 'Engineer');
console.log(child1.name); // 'Alice'
console.log(child1.age); // 25
console.log(child1.job); // 'Engineer'
console.log(child1.colors); // ['red', 'blue']
注意点和常见问题
这种继承只继承**实例属性**(即构造函数内用 this 定义的),不继承原型上的方法。所以通常要配合原型链继承一起用(比如 Child.prototype = Object.create(Parent.prototype)),否则子类无法访问父类原型方法。
- 每次创建子实例,父构造函数都会执行一次,
this.colors这类引用类型属性不会被共享,避免了原型继承中“修改一个实例影响其他”的问题 - 无法复用父类原型上的方法,必须手动挂载或组合继承
- 父类构造函数中的逻辑(如初始化、检查)会在子类中重复执行,合理即可
和 apply、bind 的区别
这里必须用 call(或 apply),因为需要**立即执行**父构造函数;bind 只返回新函数,不执行,不能直接完成属性赋值。两者参数传递方式不同:call(this, a, b) vs apply(this, [a, b]),实际效果一致,但 call 更直观常用。











