ECMAScript的组合继承

题外话:

只有自己尝试写个框架,才有机会接触像原型、作用域、事件代理、缓存系统、定时器等深层知识。

司徒正美《JavaScript框架设计》

起源

单独使用原型链继承:

  1. 优点,利用prototype实现了数据的共享,以此来实现继承。
  2. 缺点,当涉及到引用类型(比如说数组)的时候,一个实例修改了引用类型的值会影响到另一个实例,耦合性太强。

单独借用构造函数继承:

  1. 优点,子类可以向超类传参数。
  2. 缺点,方法都是在构造函数里定义的,无可复用性。

为此,才出现了组合继承

基本概念

组合继承(combination inheritance),有时候也叫做伪经典继承,指的是将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。

实现思路

使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。

//console控制台验证

//构造函数实现实例属性,构造函数的优点
function SuperType(name) {
    this.name = name;
    this.numbers = [1,2,3];
}

//原型来定义方法,原型链的优点
SuperType.prototype.sayName = function () {
    alert(this.name);
};

function SubType (name, age) {

    //继承属性
    SuperType.call(this, name);

    this.age = age;
}

//继承方法
SubType.prototype = new SuperType();

//子类新定义的方法一定要在上面的继承代码之后,要不然新写的方法就没了
SubType.prototype.sayAge = function () {
    alert(this.age);
}

var instance1 = new SubType("MirrorAvatar", 3);
instance1.numbers.push(33);
instance1.numbers;  // "[1,2,3,33]"
instance1.sayName();  //MirrorAvatar
instance1.sayAge();  //3

var instance2 = new SubType("Cindy", 4);
instance2.numbers;  //"[1,2,3]"
instance2.sayName();  //Cindy
instance2.sayAge();  //4

 

总结

组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为JavaScript中最常用的继承模式。而且,instanceof和isPrototypeOf()也能够用于识别基于组合继承创建的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值