都知道在js中沒有辦法直接實現方法重載,因為在js中如果定義了多個名稱相同,但參數個數不一樣的方法,其實只有最後一個方法能被真正調用,其他的方法都被覆蓋掉了。
但每一個函數都有一個特殊的參數arguments,利用它可以實現方法的重載。
例如:
復制代碼 代碼如下:
function Add(firstnumber,sencondnumber) {
return firstnumber+sencondnumber;
}
只能處理兩個參數,如果有多個參數,或者沒有參數,一個參數的情況都是處理不了的。如果沒有傳遞參數,則firstnumber,sencondnumber都是未定義的,如果傳遞了一個參數,就相當於只給firstnumber賦值了,sencondnumber依然是未定義。相反如果傳遞了多於兩個的參數,則相當於firstnumber,sencondnumber都賦值了,雖然還有其他的參數,但處理時都忽略掉了。如果能獲取其他的參數,自然就可以處理了。此時應該就可以想到函數的特殊參數arguments,這個包含了傳遞給函數的所有參數,利用它就可以實現方法重載的效果。
以上的方法修改如下:
復制代碼 代碼如下:
function Add(firstnumber,sencondnumber) {
if (arguments.length == 0)//沒有傳遞參數
{
return null;
}
else if (arguments.length == 1) {//傳遞的是一個參數
return firstnumber;//也可以寫為 return arguments[0];
}
else if(arguments.length == 2)//傳遞的是兩個參數
{
return firstnumber+sencondnumber;//也可以寫為 return arguments[0]+arguments[1];
}
else {
var total=0;
for (var i = 0; i < arguments.length; i++) {
total=total+arguments[i]
}
return total;
}
}
當然這種方法的弊端就是參數的順序不能打亂,如果函數實現依賴於參數的順序,就必須進行特殊處理,例如傳遞null來占位。
由於傳遞給函數的參數是嚴格按照定義函數的順序給每一個參數賦值的,如果只想給第二個參數賦值,則必須傳遞兩個參數,否則實際上傳遞的值賦值給了第一個參數,並沒有賦值給第二個參數。
例如只想給sencondnumber傳值,但不想給firstnumber傳值,必須這樣調用Add(null,2)(當然函數內部必須處理傳遞特殊值的情況),如果這樣調用Add(2),其實是給firstnumber傳值了,相當於調用了傳遞了一個參數的情況。