1. 程式人生 > >javascript面向物件程式設計--繼承--例項繼承

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