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
    

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

  • 相关阅读:
    实践 Agile Web Development 4th edition 时碰到的问题汇总
    [AWDwR4] Iteration F4
    [AWDwR4] Getting AJAX to work in Rails 3 with jQuery
    [翻译]理解C#对象生命周期
    c# asp.net 正则表达式(12)
    Application对象 简单的聊天室(16)
    c# response输出文件实例(14)
    c# asp.net fileupload实例(10)
    c# asp.net 获取客户端表单的数据(15)
    c# Request对象(13)
  • 原文地址:https://www.cnblogs.com/everlose/p/12499847.html
Copyright © 2011-2022 走看看