JS继承的六种方式

一.构造继承

1.基本思想

通过使用apply,call方法可以在新创建的对象上执行构造函数,用父类的构造函数实现子类的实例

2.具体实现

function sub(){

    Super.call(this); // 调用父类

}

3.优缺点

——优点: 简单明了,直接继承构造函数的属性和方法

——缺点: 无法继承原型链上的属性和方法

二.原型链继承

1.基本思想

利用原型链来实现继承

2.具体实现

function Sub(){}

Sub.prototype = new Super()

Sub.prototype.constructor = Sub

3.优缺点

——优点: 简单明了,实例是子类的实例,也是父类的实例

——缺点: 所有子类的实例的原型都共享同一个超类实例的属性和方法

三.组合继承

1.基本思想

结合构造函数和原型链来实现继承

2.具体实现

function Sub(){

        Super.call(this)

}

Sub.prototype = new Super()

Sub.prototype.constructor = Sub


3.优缺点

——优点: 解决了构造函数和原型链继承的问题

——缺点: 事件上子类上会拥有超类的两份属性,只是子类的属性覆盖了超类的属性

四.原型式继承

1.基本思想

通过Object.create(obj)实现

2.具体实现

if( typeof Object.prototype.create != 'function'  ){

        Object.prototype.create = function(obj){

                function F(){}

                F.prototype = obj;

                return new F()

}}


3.优缺点

——优点: 直接通过对象生成一个继承该对象的对象

——缺点: 没有类的概念

五.寄生式继承

1.基本思想

创建一个仅仅用于封装继承过程的函数,然后在内部以某种方式增强对象,最后返回对象

2.具体实现

if( typeof Object.prototype.create != 'function'  ){        

                Object.prototype.create = function(obj){               

                        function F(){}                

                        F.prototype = obj;                

                        return new F()

}}

function createSubOobj(superInstance){

        var clone = Object.create(superInstance)

        return clone

}

3.优缺点

——优点: 原型式继承的一种拓展

——缺点: 还是没有类的概念

六.寄生组合式继承

1.基本思想

集合寄生式继承和组合式继承,完美实现不带两份超类属性的继承方式

2.具体实现

function inheritPrototype(Super,Sub){

        var superProtoClone = Object.create(Super.prototype)

        superProtoClone.constructor = Sub

        Sub.prototype = Super

}

function Sub(){

    Super.call(this)

}

inheritPrototype(Super,Sub)


3.优缺点

——优点: 完美实现不带两份超类属性的继承方式

——缺点: 太过繁琐



原文链接:https://blog.csdn.net/caijixin/article/details/78295676

你可能感兴趣的:(JS继承的六种方式)