js實現繼承的幾種方式

instance檢測函數的propertype是否在對象的原型鏈上出現過函數

一、借用構造函數this

 

function People(name){
    this.name = name
}

function Student(name){
    People.call(this,name)
}

缺點:一、instance失效(超類的原型對子類不可見);二、大量重複spa

二、組合繼承prototype

function People(name){
    this.name = name
}

function Student(name){
    People.call(this,name)
}
Student.prototype=new People('zale')//重寫原型,繼承父類實例屬性與方法
Student.prototype.constructor=Student//因爲原型被重寫,因此須要從新定義一下constructor,定義類型

缺點:實例屬性被賦值了2次code

三、原型繼承對象

Object.create(obj)以obj爲原型建立對象blog

缺點:一、注意屬性共享;二、沒有子類的存在繼承

四、寄生式繼承原型鏈

let People = {
    name:'zale'
}
function Student(_prop_){
    let st = Object.create(_prop_)
    st.say = function(){
        return 'hello'
    }
    return st
}

let s1 = Student(People)

缺點:同上原型

五、寄生組合式繼承(完美)

function People(name){
    this.name = name
}
function Student(name){
    People.call(this,name)
}
Student.prototype=Object.create(People.prototype)//與組合繼承的區別:從新定義原型爲父類原型,實例方法這裏不會調用
Student.prototype.constructor=Student//因爲原型被重寫,因此須要從新定義一下constructor
相關文章
相關標籤/搜索