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();

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值