JavaScript继承中需用call/apply显式调用父构造函数以继承实例属性,因原型链仅共享方法,无法自动获取this初始化的属性;必须在子类构造函数首行执行Parent.call(this, ...args)并配合原型链继承方法。

在 JavaScript 继承中,用 call 或 apply 调用父构造函数,是实现“显式绑定实例属性”的常用方式。它让子类实例在创建时,直接执行父构造函数体,并把 this 指向当前子类实例,从而把父类中通过 this.xxx = xxx 定义的属性“复制”到子类实例上。
为什么不能只靠原型链继承属性?
原型链继承(如 Sub.prototype = Object.create(Super.prototype))只能共享方法,无法继承父构造函数内部通过 this 初始化的实例属性(比如 this.name、this.age)。这些属性不会自动出现在子类实例上,必须在子类构造函数中主动调用父构造函数来初始化。
用 call/apply 显式绑定 this 并传参
在子类构造函数中,用 Super.call(this, ...args) 就能把父构造函数里的 this.xxx 赋值行为,应用到当前子类实例上。关键点:
-
call和apply功能一致,区别仅在于参数传递方式:call(this, a, b)vsapply(this, [a, b]) - 必须在子类构造函数首行调用,确保实例属性尽早挂载
- 要传入子类接收到的参数,让父类逻辑能正确初始化
典型写法示例
例如:
function Animal(name, age) {
this.name = name;
this.age = age;
}
Animal.prototype.speak = function() {
console.log(`${this.name} is speaking`);
};
function Dog(name, age, breed) {
// ✅ 显式绑定:把 Animal 中的 this.name/this.age 挂到当前 Dog 实例
Animal.call(this, name, age);
this.breed = breed; // 子类自有属性
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
const dog = new Dog('Xiaohei', 3, 'Labrador');
console.log(dog.name); // 'Xiaohei'
console.log(dog.breed); // 'Labrador'
dog.speak(); // 'Xiaohei is speaking'
注意与组合式继承配合使用
单独用 call 只解决实例属性继承,方法仍需靠原型链。标准做法是“构造函数继承 + 原型链继承”组合:
- 用
Parent.call(this, ...)继承实例属性 - 用
Child.prototype = Object.create(Parent.prototype)继承原型方法 - 补回
constructor指向,避免丢失构造器引用

















