hand
_1_11_57
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 17:22:21
在 JavaScript 的世界里,继承是一个非常重要的概念,它允许我们创建新的对象并复用已有对象的属性和方法。组合继承是一种常用的继承方式,下面我们就来详细探讨一下组合继承的优缺点。
组合继承结合了原型链继承和构造函数继承的优点。原型链继承可以实现方法的复用,而构造函数继承可以实现属性的复用。下面是一个简单的例子:
// 父类
function Animal(name) {
this.name = name;
this.colors = ['black', 'white'];
}
Animal.prototype.sayName = function () {
console.log(this.name);
};
// 子类
function Dog(name, age) {
// 构造函数继承,继承父类的属性
Animal.call(this, name);
this.age = age;
}
// 原型链继承,继承父类的方法
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
Dog.prototype.sayAge = function () {
console.log(this.age);
};
// 创建实例
const dog1 = new Dog('旺财', 3);
const dog2 = new Dog('小白', 2);
dog1.colors.push('brown');
console.log(dog1.colors); // ['black', 'white', 'brown']
console.log(dog2.colors); // ['black', 'white']
dog1.sayName(); // 旺财
dog1.sayAge(); // 3
在这个例子中,Dog
类通过 Animal.call(this, name)
继承了 Animal
类的属性,通过 Dog.prototype = new Animal()
继承了 Animal
类的方法。
每个子类实例都有自己独立的属性副本。就像上面例子中的 colors
属性,dog1
修改了自己的 colors
数组,并不会影响 dog2
的 colors
数组。这是因为构造函数继承为每个实例都创建了独立的属性。
子类可以继承父类的方法,并且可以在子类的原型上添加新的方法。这样,所有的子类实例都可以共享这些方法,提高了代码的复用性。
优点 | 描述 |
---|---|
属性独立性 | 每个子类实例有独立的属性副本,修改属性不会影响其他实例 |
方法复用性 | 子类可以继承父类的方法,并在原型上添加新方法,提高代码复用 |
在组合继承中,父类的构造函数会被调用两次。一次是在子类构造函数中通过 Animal.call(this, name)
调用,另一次是在 Dog.prototype = new Animal()
时调用。这会导致子类的原型上有一些不必要的属性,增加了内存开销。
由于父类构造函数调用两次,会带来一定的性能开销。尤其是在创建大量子类实例时,这种性能问题会更加明显。
缺点 | 描述 |
---|---|
父类构造函数调用两次 | 导致子类原型上有不必要的属性,增加内存开销 |
性能问题 | 多次调用父类构造函数,创建大量实例时性能不佳 |
综上所述,组合继承虽然有属性独立性和方法复用性的优点,但也存在父类构造函数调用两次和性能问题的缺点。在实际开发中,我们需要根据具体情况选择合适的继承方式。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~