Javascript 面向?qū)ο?重載
更新時(shí)間:2010年05月13日 16:46:00 作者:
在面向?qū)ο笳Z(yǔ)言里重載是很重要的一個(gè)特性,而JavaScript這個(gè)自稱(chēng)面向?qū)ο蟮恼Z(yǔ)言竟然沒(méi)有直接提供重載的功能。
假如 我這樣定義:
function getDate(){.....}
function getDate(date){.....}
那么后一個(gè)方法將覆蓋前一個(gè),雖然不報(bào)錯(cuò)。
但是我們確實(shí)是可以實(shí)現(xiàn)重載的,如果你用過(guò)jQuery,你就會(huì)深有體會(huì),比如$("#btn").val() 是獲取id為"btn"的按鈕的value值,而$("#btn").val("點(diǎn)我")則是給id為"btn"的按鈕賦值。
那么JavaScript是怎么實(shí)現(xiàn)(準(zhǔn)確地講應(yīng)該叫“模擬”)的呢?。
答案很簡(jiǎn)單:arguments
arguments是JavaScript里的一個(gè)內(nèi)置對(duì)象,包含了調(diào)用者傳遞的實(shí)際參數(shù),但不局限于函數(shù)聲明所定義的參數(shù)列表,而調(diào)用時(shí)只它和數(shù)組一樣有個(gè)length屬性?!?
我們暫且把它當(dāng)“數(shù)組”來(lái)理解吧,我們根據(jù)該數(shù)組的長(zhǎng)度以及其元素的類(lèi)型來(lái)選擇不同的實(shí)現(xiàn),從而模擬了重載?!?
具體請(qǐng)看下面的示例:
function getDate(){
if(arguments.length==0){
var date=new Date().toLocaleDateString();
return "您沒(méi)有輸入?yún)?shù),現(xiàn)在時(shí)間:"+date ;
}
if(arguments.length==1){
if(arguments[0].constructor ==Date){
return "您輸入的參數(shù)是Date類(lèi)型,現(xiàn)在時(shí)間是:"+arguments[0].toDateString();
}
if(arguments[0].constructor ==String){
return "您輸入的參數(shù)是String類(lèi)型,現(xiàn)在時(shí)間是:"+arguments[0];
}
}
}
于是我們可以這樣調(diào)用:
getDate()
getDate(new Date())
getDate("星期一")
這樣就實(shí)現(xiàn)了JavaScript的重載,不過(guò)我們發(fā)現(xiàn)這樣的“實(shí)現(xiàn)”實(shí)在是太勉強(qiáng)了,如果參數(shù)多了,就會(huì)顯得力不從心,代碼也會(huì)很亂,到處是if{...} 。所以我不建議在JavaScript中使用這樣的重載。
復(fù)制代碼 代碼如下:
function getDate(){.....}
function getDate(date){.....}
那么后一個(gè)方法將覆蓋前一個(gè),雖然不報(bào)錯(cuò)。
但是我們確實(shí)是可以實(shí)現(xiàn)重載的,如果你用過(guò)jQuery,你就會(huì)深有體會(huì),比如$("#btn").val() 是獲取id為"btn"的按鈕的value值,而$("#btn").val("點(diǎn)我")則是給id為"btn"的按鈕賦值。
那么JavaScript是怎么實(shí)現(xiàn)(準(zhǔn)確地講應(yīng)該叫“模擬”)的呢?。
答案很簡(jiǎn)單:arguments
arguments是JavaScript里的一個(gè)內(nèi)置對(duì)象,包含了調(diào)用者傳遞的實(shí)際參數(shù),但不局限于函數(shù)聲明所定義的參數(shù)列表,而調(diào)用時(shí)只它和數(shù)組一樣有個(gè)length屬性?!?
我們暫且把它當(dāng)“數(shù)組”來(lái)理解吧,我們根據(jù)該數(shù)組的長(zhǎng)度以及其元素的類(lèi)型來(lái)選擇不同的實(shí)現(xiàn),從而模擬了重載?!?
具體請(qǐng)看下面的示例:
復(fù)制代碼 代碼如下:
function getDate(){
if(arguments.length==0){
var date=new Date().toLocaleDateString();
return "您沒(méi)有輸入?yún)?shù),現(xiàn)在時(shí)間:"+date ;
}
if(arguments.length==1){
if(arguments[0].constructor ==Date){
return "您輸入的參數(shù)是Date類(lèi)型,現(xiàn)在時(shí)間是:"+arguments[0].toDateString();
}
if(arguments[0].constructor ==String){
return "您輸入的參數(shù)是String類(lèi)型,現(xiàn)在時(shí)間是:"+arguments[0];
}
}
}
于是我們可以這樣調(diào)用:
getDate()
getDate(new Date())
getDate("星期一")
這樣就實(shí)現(xiàn)了JavaScript的重載,不過(guò)我們發(fā)現(xiàn)這樣的“實(shí)現(xiàn)”實(shí)在是太勉強(qiáng)了,如果參數(shù)多了,就會(huì)顯得力不從心,代碼也會(huì)很亂,到處是if{...} 。所以我不建議在JavaScript中使用這樣的重載。
您可能感興趣的文章:
- javascript函數(shù)重載解決方案分享
- Javascript基礎(chǔ) 函數(shù)“重載” 詳細(xì)介紹
- java中重載、覆蓋和隱藏三者的區(qū)別分析
- PHP和JAVA中的重載(overload)和覆蓋(override) 介紹
- JavaScript 通過(guò)模式匹配實(shí)現(xiàn)重載
- 添加JavaScript重載函數(shù)的輔助方法2
- 為JavaScript添加重載函數(shù)的輔助方法
- Javascript 面向?qū)ο笾剌d
- javascript 面向?qū)ο?實(shí)現(xiàn)namespace,class,繼承,重載
- JavaScript 的方法重載效果
- 讓 JavaScript 輕松支持函數(shù)重載 (Part 2 - 實(shí)現(xiàn))
- 讓JavaScript 輕松支持函數(shù)重載 (Part 1 - 設(shè)計(jì))
- java方法重載示例
相關(guān)文章
javascript面向?qū)ο缶幊?一) 實(shí)例代碼
javascript面向?qū)ο缶幊虒?shí)例代碼,代碼也算比較基礎(chǔ)了,不懂得朋友可以參考腳本之家之前發(fā)布的文章。2010-06-06
JavaScript 常見(jiàn)對(duì)象類(lèi)創(chuàng)建代碼與優(yōu)缺點(diǎn)分析
這幾種javascript類(lèi)定義方式中,最常用的是雜合prototype/constructor 和 動(dòng)態(tài)prototype方式。2009-12-12
JavaScript 設(shè)計(jì)模式之組合模式解析
“組合模式”顧名思意就是將多種實(shí)現(xiàn)組合在一起而達(dá)到牽一處而動(dòng)全身的效果。2010-04-04
javascript面向?qū)ο笾甁avascript 繼承
所有面向?qū)ο蟮恼Z(yǔ)言都應(yīng)該有繼承的特性,JavaScript 也不例外。2010-05-05
javascript面向?qū)ο蟮姆绞綄?shí)現(xiàn)的彈出層效果代碼
由于本人以前是.net程序員,所以即使現(xiàn)在在做前端,也習(xí)慣于用面向?qū)ο蟮姆绞骄帉?xiě)js腳本,我想如果你以前也是或者現(xiàn)在還是名第三代程序員的話,應(yīng)該對(duì)此并不陌生。
2010-01-01 
