继承

作者: 黄小猛 | 来源:发表于2017-03-18 17:24 被阅读0次

原型继承

 function SuperType () {
    this.property = true;
}

SuperType.prototype.getSuperValue = function () {
    return this.property;
};

function SubType () {
    this.subProperty = false;
}

// 继承SuperType

SubType.prototype = new SuperType();

SubType.prototype.getSubType = function () {
    return this.subProperty;
};

var instance = new SubType();

// 原型链的问题
    
    -- 包含引用类型值的原型属性会被所有的实例共享,通过原型来实现继承时,原型实际上会变成另一个类型的实例,于是原先的实力属性也就顺理成章的变成了现在的原型属性了

    function SuperType () {
            this.colors = ['red', 'yellow', 'green'];
    }

    function SubType () {}

    // 继承SuperType
    SubType.prototype = new SuperType();

    var instance1 = new SubType();
    instance1.colors.push('black');

    var instance2 = new SubType();  //  red,yellow,green,black

-- 创建子类型的实例的时候,不能像超类型的构造函数中传递参数

借用构造函数

// 借用构造函数
function SuperType () {
    this.color = ['red', 'blue', "green"];
}

function SubType () {
    // 继承SuperType
    SuperType.call(this);
}

借调了超类的构造函数,在新创建的SubType实例的环境下调用了SuperType构造函数,在新的SubType对象上执行了SuperType()函数中定义了所有的对象初始化代码,结果每一个SubType的每一个实例都会具有自己的colors属性副本了

优势:
子类构造函数可以向父类构造函数传递参数

缺点:
方法都在构造函数中定义,因此函数复用就无从谈起了

组合继承

 // 组合继承
function SuperType (name) {
    this.name = name;
    this.colors = ["red", "black", "blue"];
}


function SubType() {
    SuperType.call(this);
}

SubType.prototype = new SuperType();

不同的SubType实例既分别拥有自己的属性,又可以使用相同的方法了

原型式继承

    function object(o) {
            function F() {};
            F.prototype = o;
            return new F();
    }

    不过引用类型值得属性始终都会共享相应的值

寄生式继承

  创建一个封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像是它真的做了所有工作一样返回对象。

    function createAnother(origin) {
            var clone = object(origin);
            clone.sayHi = function () {
                  //...
            }
            return clone;
    }

寄生组合继承

优点: 因为组合继承最大的问题是无论什么情况下,都会调用两次超类构造函数 一次是创建子类原型的时候,另外一次就是在子类型构造函数内部。

寄生组合继承原理:

    通过借用构造函数来继承属性,通过原型链的混成形式来继承方法
    不必为了指定子类型的原型而调用超类型的构造函数,所需要的无非是超类型原型的一个副本而已。

    function inheritPrototype(subType, superType) {
          var prototype = object(superType.prototype);
          prototype.constructor = subType;
          subType.prototype = prototype;
    }

相关文章

  • 继承 继承

    属性拷贝 继承不单单能通过原型链实现,也能通过其他方式实现,属性拷贝就是其中一种方法。 通过属性拷贝也能实现继承子...

  • 继承(单继承,多继承)

    将共性的内容放在父类中,子类只需要关注自己特有的内容 python中所有的内容都是对象,所有的对象都直接或间接继承...

  • js继承方式

    类式继承 构造函数继承 组合继承 类式继承 + 构造函数继承 原型式继承 寄生式继承 寄生组合式继承 寄生式继承 ...

  • Python-学习之路-08 OOP -02

    单继承和多继承 单继承:每个类只能继承一个类 多继承:每个类可以继承多个类 单继承的多继承的优缺点 菱形继承/钻石...

  • 原型相关(二)

    1.继承 继承方式:接口继承(只继承方法签名)实现继承(继承实际的方法)ECMAScript只支持实现继承,并且主...

  • 继承

    继承的引入和概述 继承案例和继承的好处 继承的弊端 Java中继承的特点 继承的注意实现和什么时候使用继承 继承中...

  • Java面向对象三大特性之继承

    继承 一、继承的特点 Java只支持单继承单继承 多继承 单继承、多继承优缺点①单继承优点:提高了代码的复用性,让...

  • 7、面向对象的程序设计3(《JS高级》笔记)

    三、继承 许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际方法。由...

  • 【重学前端】JavaScript中的继承

    JavaScript中继承主要分为六种:类式继承(原型链继承)、构造函数继承、组合继承、原型式继承、寄生式继承、寄...

  • js之继承

    文章主讲 JS 继承,包括原型链继承、构造函数继承、组合继承、寄生组合继承、原型式继承、 ES6 继承,以及 多继...

网友评论

      本文标题:继承

      本文链接:https://www.haomeiwen.com/subject/jrgunttx.html