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