繼承
最近因為學校做網站設計,所以一直在ASP上和資料庫上大費苦心。
我在前一個階段是做Java程式設計的。突然接到任務並學習ASP,所以我一直都熱忠並善於利用javascript來構架ASP程式。
JavaScript的一個明顯的優點就在於它可以定義和持有自己的對象。這一點好象是VBScript所無法比擬的。
有了這一點,可以利用JavaScript進行更接近於物件導向的程式設計。也許這將使網站開發更有樂趣...
但有個嚴重的缺點!JavaScript不支援繼承機制。不象Java那樣,支援extends關鍵字(雖然這個關鍵字在JavaScript中是保留字)。
在微軟的ASP.NET中,JavaScript才開始提供比較完善的支援。PHP語言當然也有繼承機制的支援,這些都叫我垂青...
不過現在我根本無法說服學校的老頭子們買更好的網域名稱空間,但是我也不想忍受ASP中無繼承機制之苦,所以急中生智,也就有了一些成果!
JavaScript根本不支援繼承機制!這是肯定的。但是我們可以想辦法做些手腳,類比一個出來。
廢話說了一堆,先來看一個例子:
function Person()
{
public: // 注意這個public! 其實沒有這樣的用法, 這隻是我的習慣. 幸好在實際應用中不會有錯
this.GetName=Person_mfGetName;
private: // 和public一樣, 這也是我的習慣
this.m_strName="Guest";
}
function Person_mfGetName()
{
return this.m_strName;
}
var MyPerson=new Person();
MyPerson.GetName();
你可以用任何輸出語句來查看結果。當然這隻是第一步!
下面是關鍵一步:繼承!
function Student() // Extends Class: Person
{
EXTENDS: // 我的習慣, 但要切記不能使用小寫字母. 因為extends是JavaScript中的保留字
this.Super=Person; // 定義指向其"父類構造器". 這裡的Super也不能用小寫形式
this.Super(); // 調用其"父類構造器". 這樣就可以從"父類"那裡"繼承"所有的屬性和方法
private:
this.m_nStudentID=0;
}
雖然在Student中並沒有看到GetName()方法,但是卻可以調用。因為他已經繼承了Person的GetName()方法。
var MyStudent=new Student();
MyStudent.GetName(); // 注意, 調用的是其"父類"的GetName方法, 結果為返回 "Guest".
關於JavaScript繼承實現就是這樣。只要牢記兩步:
1: 在"子類"中先定義一個指向"父類"的函數(什麼名字都可以,我習慣使用Super)
2: 隨後調用這個函數
這樣就可以繼承"父類"的所有屬性和方法!
我現在有些懷疑的是,既然extends和super都是保留字,那為什麼JavaScript卻不支援繼承呢?
不知道有沒有其他更好的辦法?希望各位指點...