原型鏈實現集繼承
function father(){
this.val=1;
this.arr=[1]
}
function son(){}
son.prototype=new father
var son1=new son()
var son2=new son()
son1.val=2
son2.varl //1
son1.arr.push(2)
son2.arr //[1,2]
上面的代碼實現原型鏈繼承最重要的son.prototype=new father
原型鏈繼承的優點和缺點:
優點:實現容易,操作簡單
缺點:來自原型對象的引用屬性是所有實例都共享的,
另一個缺點就是 無法通過子類構造器向父類傳參
構造器函數實現繼承
function father(val){
this.val=val
this.arr=arr;
this.fun=function(){}
}
function son (val){
father.call(this,val)
}
var son1=new son(1)
var son2=new son(2)
核心:借用父類的構造器來增強子類的實例,相當于把父類的實例屬性復制一給子類裝上(完全沒有用到原型)
優點:解決了子類共享父類引用書屬性的問題
子類構造器能夠向父類構造器傳參
缺點:無法實現函數的復用,每個子類實例都有一個自己的方法,太多了影響性能
組合發方式實現繼承
function super(){
this.val=2
this.arr=[2]
}
super.prototype.fun=function(){}
function sub(){
father.call(this)
}
sub.prototype=new super
var sub1=new sub()
var sub2=new sub()
核心:把實例函數都放在原型對象上,以實現函數復用。同時還要保留借用構造函數方式的優點,通過Super.call(this);繼承父類的基本屬性和引用屬性并保留能傳參的優點;通過Sub.prototype = new Super();繼承父類函數,實現函數復用
優點:不存在子類實例共享父類引用屬性的問題
可傳參
函數可復用
缺點: 父類構造器被實例化兩次,浪費內存