上幾節講了 JavaScript 物件導向之命名空間 、 javascript 物件導向的JavaScript類 與 JavaScript 物件導向的之私人成員和公開成員 ,大家可以先看上面的再繼續往下看。
假如 我這樣定義: 複製代碼 代碼如下:function getDate(){.....}
function getDate(date){.....}
那麼後一個方法將覆蓋前一個,雖然不報錯。
但是我們確實是可以實現重載的,如果你用過jQuery,你就會深有體會,比如$("#btn").val() 是擷取id為"btn"的按鈕的value值,而$("#btn").val("點我")則是給id為"btn"的按鈕賦值。
那麼JavaScript是怎麼實現(準確地講應該叫“類比”)的呢?。
答案很簡單:arguments
arguments是JavaScript裡的一個內建對象,包含了調用者傳遞的實際參數,但不局限於函式宣告所定義的參數列表,而調用時只它和數組一樣有個length屬性。
我們暫且把它當“數組”來理解吧,我們根據該數組的長度以及其元素的類型來選擇不同的實現,從而類比了重載。
具體請看下面的樣本:
複製代碼 代碼如下:function getDate(){
if(arguments.length==0){
var date=new Date().toLocaleDateString();
return "您沒有輸入參數,現在時間:"+date ;
}
if(arguments.length==1){
if(arguments[0].constructor ==Date){
return "您輸入的參數是Date類型,現在時間是:"+arguments[0].toDateString();
}
if(arguments[0].constructor ==String){
return "您輸入的參數是String類型,現在時間是:"+arguments[0];
}
}
}
於是我們可以這樣調用: 複製代碼 代碼如下:getDate()
getDate(new Date())
getDate("星期一")
這樣就實現了JavaScript的重載,不過我們發現這樣的“實現”實在是太勉強了,如果參數多了,就會顯得力不從心,代碼也會很亂,到處是if{...} 。所以我不建議在JavaScript中使用這樣的重載。