• 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
    

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

  • 相关阅读:
    mongo 查询某个字段的值不为空列表!
    pdftohtml的使用
    Activiti数据库表结构(表详细版)
    ElasticSearch在linux上安装部署
    构建Spring Web应用程序—关于spring中的validate注解后台校验的解析
    构建Spring Web应用程序—SpringMVC详解
    高级装配—运行时注入
    高级装配—bean的作用域
    高级装配—条件化的Bean
    高级装配—配置profile bean
  • 原文地址:https://www.cnblogs.com/everlose/p/12499847.html
Copyright © 2020-2023  润新知