經過使用call,apply方法能夠在新建立的對象上執行構造函數,用弗雷的構造函數來增長子類的實例javascript
優勢:簡單明瞭,直接繼承超類構造函數的屬性和方法java
缺點:沒法繼承原型鏈上的屬性和方法app
【約定】:函數
// 父類 function Super(){ this.property = 'Super Property' } Super.prototype.getProperty = function(){ return this.property }
// 子類 function Sub(){ Super.call(this) this.property = 'Sub Property' }
利用原型鏈來實現繼承,超類的一個實例做爲子類的原型this
// 子類 function Sub(){ this.property = 'Sub Property' } Sub.prototype = new Super() // 注意這裏new Super()生成的超類對象並無constructor屬性,故需添加上 Sub.prototype.constructor = Sub
優勢:簡單明瞭容易實現。實例是子類的實例,實際上也是父類的一個實例。父類新增原型方法屬性,子類都能繼承訪問prototype
缺點:全部子類的實例的原型都共享同一個超類實例的屬性和方法對象
沒法實現多繼承blog
利用構造函數和原型鏈組合繼承
// 子類 function Sub(){ Super.call(this) this.property = 'Sub Property' } Sub.prototype = new Super() // 注意這裏new Super()生成的超類對象並無constructor屬性,故需添加上 Sub.prototype.constructor = Sub
優勢:解決了構造繼承和原型鏈繼承的兩個問題ip
缺點:實際上子類會擁有超類的兩份屬性,只是子類的屬性覆蓋了超類的屬性
採用原型式繼承並不須要定義一個類,傳入參數obj生成一個繼承obj對象的對象
function objectCreate(obj){ function F(){} F.prototype = obj return new F() }
優勢:直接經過對象生成一個繼承該對象的對象
缺點:不是類式繼承,而是原型式基礎,缺乏了類的概念