javascript面向物件程式設計--繼承--例項繼承
類繼承和原型繼承的弊端:
它們在客戶端是無法繼承DOM物件的,同時他們也不支援繼承系統物件和方法
類繼承:
function D(){ Date.apply(this.arguments);}
var d=new D();
alert(d.toLocaleString());//返回[object object]
說明類繼承是無法是想對靜態物件的繼承,這是因為系統物件的結構比較特殊,它不是簡單的函式題結構,宣告、賦值、和初始化等操作都進行了獨立的封裝,所以無法實現在自定義建構函式中的那種操作
類繼承:不繼承原型屬性,繼承本地成員,支援多重繼承,支援多引數 執行效率高,instanceof為false
原型繼承:
function D(){}
D.prototype=new Date();
var d=new D();
alert(d.toLocalString());//返回錯誤提示
原型繼承:繼承原型屬性,不繼承本地成員,不支援多重繼承,不支援多引數,執行效率高,instanceof為true
例項繼承:
建構函式是一種特殊結構的函式,沒有返回值,通過this關鍵字來初始化例項物件,並且會返回值(其實省略return new運算表示式的值);因此在建構函式中完成對 類的例項化操作,然後返回例項物件,這就是例項繼承的由來
function D(){//封裝函式
var d=new Date(); //例項化Date物件
d.get=function(){
alert(d.toLocaleString());
}
return d;//返回例項化物件
}
var d=new D();//例項化封裝函式
d.get();
例項繼承的優勢:
能夠實現對所有物件的繼承,包括自定義類、核心物件和Dom物件等,不過例項繼承不是真正的繼承機制,僅是一種模擬方法
缺點:
例項繼承無法傳遞動態引數,類的例項化操作封閉在函式體內實現的,所以不能通過call()和apply()方法傳遞動態引數
只能返回一個物件,因此不支援多重繼承
無法真正實現繼承物件是封裝類的例項,它仍然保持與原物件的例項關係如:
alert( d instanceof Date) //true
alert( d instanceof D) //false 說明物件d不是物件D的例項
例項繼承:繼承原型屬性,繼承本地成員,不支援多重繼承,不支援多引數,執行效率中,instanceof為false