JS小红书-继承的几种实现方式

447 阅读2分钟

JS小红书-继承的几种实现方式

继承这篇和对象创建模式可以一起看,千丝万缕的关系,相信只要理解了一个,就能都搞定。有些面试还是很喜欢问这些的。当然这些都是js基础,都是实打实的砖头,掌握这些,未来的路才走的更稳健。

  1. 原型链继承
  2. 构造函数继承
  3. 组合继承
  4. 原型式继承
  5. 寄生式继承
  6. 寄生组合式继承 ps:以下代码部分只贴主要继承部分

1.原型链继承

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

2.构造函数继承

function SubTypeSuperType(){
    //继承了SuperType
    SuperType.call(this)
}

3.组合继承

function SubTypeSuperType(){
    //继承了SuperType
    SuperType.call(this)   //第二用SuperType
}
SubType.prototype = new SuperType()   //第一次调用SuperType

优点

构造函数中定义属性,原型定义方法,实现属性私有,方法共享

缺点

第一次调用SuperType,SubType.prototype 会得到SuperType的属性,第二用SuperType,又会得到SuperType的属性,这一次是属性是在实例上,于是这2个属性就屏蔽了原型链上的同名属性

4.原型式继承

自定义object

function object(o){
    function F(){}
    f.prototype=o
    return new F()
}
var person={
    name:'jack',
    age:15
}
//通过object实现继承
var person1=object(person)

Object.create()


var person1=Object.create(person)
//Object.create() 接受2个参数,一个用作新对象原型的对象,一个为新对象定义额外属性的对象。
//第二个参数和object.defineProperties 第二个参数格式一样
var person2=Object.create(person,{
    name:{
        value:'tom'
    }
})

5.寄生式继承

function createAnother(original){
    var clone = object(original)
    clone.sayHi = function(){
        console.log('h1')
    }
    return clone
}

6.寄生组合式继承

function  inheritPropertype(subType,superType){
    //prototype 的原型对象是superType的原型对象的原型对象
    var prototype = object(superType.prototype)
    //prototype 的constructor 指向subType
    prototype.constructor = subType
    //subType的原型对象指向prototype
    subType.prototype = prototype
}

和组合继承相比,借用构造函数继承属性,通过原型链继承方法且高效率之处体现在只调用了一次superType构造函数,并且避免了在subType.prototype上创建不必要的属性,与此同时,原型链保持不变。因此还能正常的使用instanceof 和isPropertyOf()。extend()方法也是采用了寄生组合式继承

好了,完结,撒花~~~