组合继承通过结合原型链和构造函数来实现,具体做法是在子类的构造函数中调用父类构造函数以继承实例属性,同时将父类的原型对象赋值给子类的原型以共享方法。这样做既能保证每个实例拥有独立的属性副本,又能实现方法的高效复用。

如何确保子类实例拥有独立的父类属性
在子类构造函数内部使用 call 或 apply 调用父类构造函数,可以将父类的属性绑定到当前子类实例上,从而确保每个实例都拥有独立的属性副本,避免引用类型属性的相互污染。

function Parent(name) {
this.name = name;
this.colors = ['red', 'blue'];
}
function Child(name, age) {
// 第二次调用 Parent 构造函数
Parent.call(this, name);
this.age = age;
}如何实现子类对父类方法的共享与复用
将子类的原型对象指向父类的原型对象,即 Child.prototype = new Parent(),这样子类实例就可以访问到父类原型上的所有方法,且这些方法在所有子类实例之间是共享的,节省了内存空间。
立即学习“Java免费学习笔记(深入)”;

// 第一次调用 Parent 构造函数
Parent.prototype.sayName = function() {
console.log(this.name);
};
// 继承原型
Child.prototype = new Parent();
Child.prototype.constructor = Child;
Child.prototype.sayAge = function() {
console.log(this.age);
};组合继承中父类构造函数被调用了多少次
在标准的组合继承实现中,父类构造函数会被调用两次:第一次是在创建子类原型对象时(new Parent()),第二次是在子类构造函数内部(Parent.call(this))。这会导致子类原型上产生一些多余的、被遮蔽的父类实例属性。


















