zoukankan      html  css  js  c++  java
  • 寄生组合式继承

     // 组合继承是javascript中最常用的继承模式,不过,他也有自己的不足,组合继承最大的问题是无论什么情况下,
    // 都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数的内部。
    // 没错,子类型最终会包含超类型对象的全部实例属性,但我们不得不在调用子类型构造函数时重写这些属性。
    // 再来看一下下面组合继承的例子

    function SuperType(name){
    this.name=name;
    this.colors=["red","blue","green"];
    }
    SuperType.prototype.sayName=function(){
    console.log(this.name);
    }
    function SubType(name,age){
    SuperType.call(this,name); // 第二次调用SuperType()
    this.age=age;
    }

    SubType.prototype=new SuperType(); // 第一次调用SuperType()
    SubType.prototype.constructor=SubType;
    SubType.prototype.sayAge=function(){
    console.log(this.age);
    }

    // 加粗字体的行中是调用SuperType构造函数的代码。在第一次调用SuperType构造函数时,
    // SubType.prototype会得到两个属性:name和colors;它们都是SuperType的实例属性,只不过现在位于SubType的原型中。
    // 当调用SubType构造函数时,又会调用一次SuperType构造函数,这一次又在新对象上创建了实例属性name和colors。
    // 于是,这两个属性就屏蔽了原型中的两个同名属性。


    // 所谓寄生式组合继承,即通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。其背后的基本思路是:
    // 不必为了指定子类型的原型而调用超类型的构造函数,我们所需要的无非就是超类型原型的一个副本而已。
    // 本质上,使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。寄生组合式继承的基本模式如下所示。

    function inheritPrototype(subType,superType){
    var prototype=Object(subType,superType);
    prototype.constructor=subType;
    subType.prototype=prototype;
    }
    // 这个示例中的inheritPrototype()函数实现了寄生组合式继承的最简单形式。
    // 这个函数接收两个参数:子类型构造函数和超类型构造函数。在函数内部,第一步是创建超类型原型的一个副本。
    // 第二步是为创建的副本添加constructor属性,从而弥补因重写原型而失去的默认的constructor属性。
    // 最后一步,将新创建的对象赋值给子类型的原型。这样,我们就可以使用inheritPrototype()函数的语句,
    // 去替换前面例子中为子类型原型赋值的语句了,例如:
    function SuperType(name){
    this.name=name;
    this.colors=["red","blue","green"];
    }
    SuperType.prototype.sayName=function(){
    console.log(this.name);
    }
    function SubType(name,age){
    SuperType.call(this,name);
    this.age=age;
    }
    inheritPrototype(SubType,SuperType);
    SubType.prototype.sayAge=function(){
    console.log(this.age);
    }

    // 这个例子的高效率体现了它只调用了一次SuperType构造函数,并且因此避免了在SubType.prototype上面创建不必要的、多余的属性。
    // 与此同时,原型链还能保持不变;因此,还能够正常使用instanceof和isPrototypeOf()。
    // 开发人员普遍认为寄生组合式继承是引用类型最理想的继承模式。

    // YUI的YAHOO.lang.extend()方法采用了寄生组合继承,从而让这种模式首次出现在了一个应用非常广泛的javaScript库中。
















  • 相关阅读:
    项目实战从0到1之hive(34)大数据项目之电商数仓(用户行为数据采集)(二)
    项目实战从0到1之hive(33)大数据项目之电商数仓(用户行为数据采集)(一)
    项目实战从0到1之spark(32)大数据项目之电商数仓(总结)(二):系统业务数据仓库
    项目实战从0到1之spark(31)大数据项目之电商数仓(总结)(一):系统业务数据仓库
    LeetCode435. 无重叠区间
    LeetCode392. 判断子序列
    LeetCode455. 分发饼干
    LeetCode128. 最长连续序列
    LeetCode376. 摆动序列
    LeetCode1143. 最长公共子序列
  • 原文地址:https://www.cnblogs.com/liululu/p/5871223.html
Copyright © 2011-2022 走看看