`
MirrorAvatar
  • 浏览: 46448 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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()也能够用于识别基于组合继承创建的对象。

1
1
分享到:
评论

相关推荐

    15分钟深入了解JS继承分类、原理与用法

    所以,下面所要说的原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承和寄生组合式继承都属于实现继承。 最后的最后,我会解释 ES6 中的 extend 语法利用的是寄生组合式继承。 1. 原型链继承 ...

    javascript 中的继承实例详解

    组合继承 寄生组合式继承 后记 继承有两种方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。 由于函数没有签名,在ECMAScript中无法实现接口继承。ECMAScript只支持实现继承,...

    史上最为详细的javascript继承(推荐)

    组合继承 原型式继承 寄生式继承 寄生组合 原型链继承 相信小伙伴们都知道到原型链继承(ECMAScript 中描述了原型链的概念,并将原型链作为实现继承的主要方法),因为原型链继承非常的强大,但是也有它的缺点,...

    es-abstract-refs:ECMAScript 的抽象参考提案

    尽管具有函数式编程设施,但 ECMAScript 表现出对使用实例方法的面向对象的“从左到右”组合的强烈偏好。 不幸的是,通过实例方法的组合需要通过向对象或对象的原型祖先添加函数值属性来实现可扩展性。 这会导致以下...

    monocle-decorators.js:经典的装饰器

    优先考虑可组合性而不是继承。 作为装饰器@_o.mixin(ArrayOfMixins) import _o from 'monocle-decorators' class Walkable { walk ( ) { const speed = 5 this . distanceFromOrigin += speed } } class ...

    精通qt4编程(源代码)

    \6.6 组合模式绘图 192 \6.7 Graphics View框架 200 \6.7.1 Graphics View体系结构 200 \6.7.2 Graphics View坐标系统 201 \6.7.3 深入Graphics View 202 \6.8 图形图像打印 208 \6.8.1 普通打印过程 208 \6.8.2 ...

    精通Qt4编程(第二版)源代码

    \19.1 执行ECMAScript脚本 459 \19.2 QtScript中的信号和槽 460 \19.3 使用JavaScript操作Qt对象 463 \19.4 基于Prototype的继承 467 \19.5 小结 467 \第20章 国际化 468 \20.1 Unicode与字符编码 468 \...

    JavaScript基础和实例代码

    1.8.1 ECMAScript 1.8.2 DOM 1.8.3 BOM 1.9 客户端与服务器端脚本 1.10 JavaScript与JScript、 VBScript 1.11 JavaScript与Java、Java applet 1.12 JavaScript的未来如何 1.13 本章小结 第2章 JavaScript语言入门 ...

    源文件程序天下JAVASCRIPT实例自学手册

    1.8.1 ECMAScript 1.8.2 DOM 1.8.3 BOM 1.9 客户端与服务器端脚本 1.10 JavaScript与JScript、 VBScript 1.11 JavaScript与Java、Java applet 1.12 JavaScript的未来如何 1.13 本章小结 第2章 JavaScript语言入门 ...

    JavaScript高级教程

    1.2.1 ECMAScript 1.2.2 DOM..............................................5 1.2.3 BOM..............................................8 1.3 小结..............................................8 第 2 章 ...

Global site tag (gtag.js) - Google Analytics