zoukankan      html  css  js  c++  java
  • ES5 的继承最优解

    摘录自javascript高级程序设计第三版第六章,6.3继承。

    需要继承来自于超类的属性(考虑到有引用类型,如数组不希望被共用),和来自于超类原型的方法(考虑到多个对象使用同一个方法能节省内存开销),这就得使用借用构造模式(SubType.prototype = new SuperType())来继承超类原型的方法,并且子类构造函数中使用原型链模式(SuperType.call(this, name))来继承超类的属性。

    寄生组合式继承

    //先创建一个超类原型的副本
    //为创建的副本添加constructor指针
    //将创建的对象副本赋值给子类
    //这就完成了继承超类方法与属性的目的,而且不用一次次调用超类的构造函数
    function inheritPrototype (SubType, SuperType) {
        var prototype = Object.create(SuperType.prototype); //创建对象
        prototype.constructor = SubType; //增强对象
        SubType.prototype = prototype; //指定对象
    }
    
    function SuperType (name) {
        this.name = name;
        this.array = [1, 2, 3];
    }
    SuperType.prototype.sayName = function () {
        alert(this.name);
    }
    
    
    function SubType (name, age) {
        //继承超类属性
        SuperType.call(this, name);
        this.age = age;
    }
    
    //继承超类方法
    inheritPrototype(SubType, SuperType);
    SubType.prototype.sayAge = function () {
        alert(this.age);
    };
    var instance1 = new SubType('Nicholas', 29);
    var instance2 = new SubType('Greg', 27);
    instance1.array.push(4); //[1, 2, 3, 4]
    instance2.array; //[1, 2, 3]
    instance1.name; //"Nicholas"
    instance2.name; //"Greg"
    instance1.sayAge; //29
    instance2.sayAge; //27
    

    这个模式的高效之处就在于只会调用一次超类的构造函数,避免了在子类上一遍遍创建超类原型上多余的属性。与此同时,原型链还能保持不变,是开发人员普遍认为的最理想继承模式。

  • 相关阅读:
    CAD图形引擎库VectorDraw
    基于COM的矢量图像控件VectorDraw
    [转]电子表格Spread 7.0线上发布会
    ProEssentials图表教程汇总
    几种JS 引擎介绍(不同浏览器有不同的引擎)
    我的 学习链接
    ExtJS 2.3版 源代码的解析(转)
    javascript调试原理(一)(转)
    使用GoogleCode SVN服务
    javascript调试原理(二) 模拟实现 (转)
  • 原文地址:https://www.cnblogs.com/everlose/p/12499847.html
Copyright © 2011-2022 走看看