都知道在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傳值了,相當于調用了傳遞了一個參數的情況。
- 前言
- js封裝和作用域
- 封裝html的select標簽的js操作
- js正則表達式的使用
- 使用閉包對setTimeout進行簡單封裝
- js中如何復制一個對象,如何獲取所有屬性和屬性對應的值
- js中如何把字符串轉化為對象
- js操作iframe兼容各種瀏覽器
- js模板方法的思路及實現
- 在js中如何實現方法重載?以及函數的參數問題
- 單純的html頁面如何提交,傳遞參數,以及對身份的驗證
- ajax如何調試
- js綜合應用簡單的表格統計
- js格式化貨幣數據
- js綜合應用:表格的四則運算
- 如何在瀏覽器中打開PDF文件并實現預覽的思路與代碼
- js實現幻燈片效果
- js實現幻燈片效果二
- jquery-easyui必填項隱藏問題的處理方案
- jquery-easyui隱藏可用不可用的問題的處理方案
- js變量作用域--變量提升