javascript继承的实现方式总结

1.原型链继承(常用)

思想:利用原型让一个引用类型继承另一个引用类型的属性和方法
特点:
无法实现多继承(多继承即一个子类可以有多个父类,它继承了多个父类的特性。)
无法实现传参
能访问原型方法/原型属性
不能继承实例属性和方法
引用类型的属性被所有实例共享【缺点】

// 子类function Sub(){    
    this.property = 'Sub Property'
}
Sub.prototype = new Super()
// 注意这里new Super()生成的超类对象并没有constructor属性Sub.prototype.constructor = Sub

2.构造继承(常用)

思想:在子类型构造函数的内部调用超类型的构造函数
特点:
可以实现多继承
可以实现传参
只能继承实例属性和方法
不能继承原型方法/原型属性
方法都在构造函数中定义,每次创建实例都会创建一遍方法。【缺点】

// 子类function Sub(){    
    Super.call(this)    
    this.property = 'Sub Property'
}

3.组合继承(原型链和构造函数)(常用)

使用原型链实现对原型属性和方法的继承,通过使用构造函数实现对实例属性的继承
特点
集上面两者优点于一身
组合继承最大的缺点是会调用两次父构造函数:一次是设置子类型实例的原型的时候,一次在创建子类型实例的时候。

// 子类function Sub(){    
    Super.call(this)    
}
Sub.prototype = new Super()
// 注意这里new Super()生成的超类对象并没有constructor属性
Sub.prototype.constructor = Sub

4.拷贝继承(原型式继承)

就是 ES5 Object.create 的模拟实现,将传入的对象作为创建的对象的原型。
思想:采用原型式继承并不需要定义一个类,传入参数obj,生成一个继承obj对象的对象
特点:
直接通过对象生成一个继承该对象的对象
不是类式继承,而是原型式基础,缺少了类的概念
包含引用类型的属性值始终都会共享相应的值,这点跟原型链继承一样。【缺点】

function objectCreate(obj){    
    function F(){}    
    F.prototype = obj    
    return new F()
}

5.实例继承(寄生式继承)

思想:创建一个仅仅用于封装继承过程的函数,然后在内部以某种方式增强对象,最后返回对象
特点:
原型式继承的一种拓展
依旧没有类的概念
【缺点】跟借用构造函数模式一样,每次创建对象都会创建一遍方法。

function objectCreate(obj){   
    function F(){}    
    F.prototype = obj    
    return new F()
}
function createSubObj(superInstance){    
    var clone = objectCreate(superInstance)    
    clone.property = 'Sub Property'    
    return clone
}

6. 寄生组合式继承

思想:结合寄生式继承和组合式继承,完美实现不带两份超类属性的继承方式
特点:
完美实现继承,解决了组合式继承带两份属性的问题
过于繁琐,故不如组合继承
例子:

function inheritPrototype(Super,Sub){    
var superProtoClone = Object.Create(Super.prototype);       superProtoClone.constructor = Sub; 
Sub.prototype = Super
}
function Sub(){    
    Super.call()    
    Sub.property = 'Sub Property'
}
inheritPrototype(Super,Sub)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值