JS继承之组合继承

前面介绍了原型链继承以及构造函数继承,它们都有各自的优缺点

特点 优点 缺点
原型链继承 子类原型prototype对父类实例化来实现 子类不仅仅可以访问父类原型上的属性和方法,同样也可以访问从父类构造函数中复制的属性和方法 1.一个子类原型更改子类原型从父类继承来的引用类型属性就会直接影响其他子类;
2.由于子类实现的继承是靠其原型对父类的实例化实现的,因此在创建父类的时候,是无法向父类传递参数的,因而在实例化父类时也无法对父类构造函数的属性进行初始化。
构造函数继承 在子类构造函数作用环境执行一次父类的构造函数实现 避免了引用类型的属性被所有实例共享,而且可以在子类中向父类传参 这种类型的继承没有涉及原型prototype,所以父类的原型方法自然不会被子类继承,而要想被子类继承就必须把放在构造函数里,这样创建出来的每个实例都会单独拥有一份而不能共用,这样就违背了代码复用的原则

基于此,为了综合这两种模式的优点,就有了组合继承。

function Parent (name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}
Parent.prototype.getName = function () { return this.name; }

function Child (name, age) {
  Parent.call(this, name);  
  this.age = age;
}
Child.prototype = new Parent();

首先,在子类构造函数执行了父类构造函数,然后子类原型上实例化父类就是组合模式。如此,组合式继承就融合了原型链继承和构造函数继承的优点,并且过滤了其缺点。

猜你喜欢

转载自blog.csdn.net/qq_32682137/article/details/82426401