js中方法重載如何實現(xiàn)?以及函數(shù)的參數(shù)問題
更新時間:2013年08月01日 15:32:05 作者:
js中沒有辦法直接實現(xiàn)方法重載,但每一個函數(shù)都有一個特殊的參數(shù)arguments,利用它可以實現(xiàn)方法的重載,具體示例如下
都知道在js中沒有辦法直接實現(xiàn)方法重載,因為在js中如果定義了多個名稱相同,但參數(shù)個數(shù)不一樣的方法,其實只有最后一個方法能被真正調(diào)用,其他的方法都被覆蓋掉了。
但每一個函數(shù)都有一個特殊的參數(shù)arguments,利用它可以實現(xiàn)方法的重載。
例如:
function Add(firstnumber,sencondnumber) {
return firstnumber+sencondnumber;
}
只能處理兩個參數(shù),如果有多個參數(shù),或者沒有參數(shù),一個參數(shù)的情況都是處理不了的。如果沒有傳遞參數(shù),則firstnumber,sencondnumber都是未定義的,如果傳遞了一個參數(shù),就相當(dāng)于只給firstnumber賦值了,sencondnumber依然是未定義。相反如果傳遞了多于兩個的參數(shù),則相當(dāng)于firstnumber,sencondnumber都賦值了,雖然還有其他的參數(shù),但處理時都忽略掉了。如果能獲取其他的參數(shù),自然就可以處理了。此時應(yīng)該就可以想到函數(shù)的特殊參數(shù)arguments,這個包含了傳遞給函數(shù)的所有參數(shù),利用它就可以實現(xiàn)方法重載的效果。
以上的方法修改如下:
function Add(firstnumber,sencondnumber) {
if (arguments.length == 0)//沒有傳遞參數(shù)
{
return null;
}
else if (arguments.length == 1) {//傳遞的是一個參數(shù)
return firstnumber;//也可以寫為 return arguments[0];
}
else if(arguments.length == 2)//傳遞的是兩個參數(shù)
{
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;
}
}
當(dāng)然這種方法的弊端就是參數(shù)的順序不能打亂,如果函數(shù)實現(xiàn)依賴于參數(shù)的順序,就必須進行特殊處理,例如傳遞null來占位。
由于傳遞給函數(shù)的參數(shù)是嚴(yán)格按照定義函數(shù)的順序給每一個參數(shù)賦值的,如果只想給第二個參數(shù)賦值,則必須傳遞兩個參數(shù),否則實際上傳遞的值賦值給了第一個參數(shù),并沒有賦值給第二個參數(shù)。
例如只想給sencondnumber傳值,但不想給firstnumber傳值,必須這樣調(diào)用Add(null,2)(當(dāng)然函數(shù)內(nèi)部必須處理傳遞特殊值的情況),如果這樣調(diào)用Add(2),其實是給firstnumber傳值了,相當(dāng)于調(diào)用了傳遞了一個參數(shù)的情況。
但每一個函數(shù)都有一個特殊的參數(shù)arguments,利用它可以實現(xiàn)方法的重載。
例如:
復(fù)制代碼 代碼如下:
function Add(firstnumber,sencondnumber) {
return firstnumber+sencondnumber;
}
只能處理兩個參數(shù),如果有多個參數(shù),或者沒有參數(shù),一個參數(shù)的情況都是處理不了的。如果沒有傳遞參數(shù),則firstnumber,sencondnumber都是未定義的,如果傳遞了一個參數(shù),就相當(dāng)于只給firstnumber賦值了,sencondnumber依然是未定義。相反如果傳遞了多于兩個的參數(shù),則相當(dāng)于firstnumber,sencondnumber都賦值了,雖然還有其他的參數(shù),但處理時都忽略掉了。如果能獲取其他的參數(shù),自然就可以處理了。此時應(yīng)該就可以想到函數(shù)的特殊參數(shù)arguments,這個包含了傳遞給函數(shù)的所有參數(shù),利用它就可以實現(xiàn)方法重載的效果。
以上的方法修改如下:
復(fù)制代碼 代碼如下:
function Add(firstnumber,sencondnumber) {
if (arguments.length == 0)//沒有傳遞參數(shù)
{
return null;
}
else if (arguments.length == 1) {//傳遞的是一個參數(shù)
return firstnumber;//也可以寫為 return arguments[0];
}
else if(arguments.length == 2)//傳遞的是兩個參數(shù)
{
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;
}
}
當(dāng)然這種方法的弊端就是參數(shù)的順序不能打亂,如果函數(shù)實現(xiàn)依賴于參數(shù)的順序,就必須進行特殊處理,例如傳遞null來占位。
由于傳遞給函數(shù)的參數(shù)是嚴(yán)格按照定義函數(shù)的順序給每一個參數(shù)賦值的,如果只想給第二個參數(shù)賦值,則必須傳遞兩個參數(shù),否則實際上傳遞的值賦值給了第一個參數(shù),并沒有賦值給第二個參數(shù)。
例如只想給sencondnumber傳值,但不想給firstnumber傳值,必須這樣調(diào)用Add(null,2)(當(dāng)然函數(shù)內(nèi)部必須處理傳遞特殊值的情況),如果這樣調(diào)用Add(2),其實是給firstnumber傳值了,相當(dāng)于調(diào)用了傳遞了一個參數(shù)的情況。
相關(guān)文章
JS寫的數(shù)字拼圖小游戲代碼[學(xué)習(xí)參考]
昨天沒事做,就用JS寫了個數(shù)字拼圖的小游戲,自娛自樂。 可惜關(guān)于逆序數(shù)的問題還沒解決,現(xiàn)在有時是拼不成的,大家見諒了。2008-10-10