Javascript 面向對象 重載
更新時間:2010年05月13日 16:46:00 作者:
在面向對象語言里重載是很重要的一個特性,而JavaScript這個自稱面向對象的語言竟然沒有直接提供重載的功能。
假如 我這樣定義:
function getDate(){.....}
function getDate(date){.....}
那么后一個方法將覆蓋前一個,雖然不報錯。
但是我們確實是可以實現(xiàn)重載的,如果你用過jQuery,你就會深有體會,比如$("#btn").val() 是獲取id為"btn"的按鈕的value值,而$("#btn").val("點我")則是給id為"btn"的按鈕賦值。
那么JavaScript是怎么實現(xiàn)(準確地講應該叫“模擬”)的呢?。
答案很簡單:arguments
arguments是JavaScript里的一個內置對象,包含了調用者傳遞的實際參數(shù),但不局限于函數(shù)聲明所定義的參數(shù)列表,而調用時只它和數(shù)組一樣有個length屬性?!?
我們暫且把它當“數(shù)組”來理解吧,我們根據(jù)該數(shù)組的長度以及其元素的類型來選擇不同的實現(xiàn),從而模擬了重載?!?
具體請看下面的示例:
function getDate(){
if(arguments.length==0){
var date=new Date().toLocaleDateString();
return "您沒有輸入?yún)?shù),現(xiàn)在時間:"+date ;
}
if(arguments.length==1){
if(arguments[0].constructor ==Date){
return "您輸入的參數(shù)是Date類型,現(xiàn)在時間是:"+arguments[0].toDateString();
}
if(arguments[0].constructor ==String){
return "您輸入的參數(shù)是String類型,現(xiàn)在時間是:"+arguments[0];
}
}
}
于是我們可以這樣調用:
getDate()
getDate(new Date())
getDate("星期一")
這樣就實現(xiàn)了JavaScript的重載,不過我們發(fā)現(xiàn)這樣的“實現(xiàn)”實在是太勉強了,如果參數(shù)多了,就會顯得力不從心,代碼也會很亂,到處是if{...} 。所以我不建議在JavaScript中使用這樣的重載。
復制代碼 代碼如下:
function getDate(){.....}
function getDate(date){.....}
那么后一個方法將覆蓋前一個,雖然不報錯。
但是我們確實是可以實現(xiàn)重載的,如果你用過jQuery,你就會深有體會,比如$("#btn").val() 是獲取id為"btn"的按鈕的value值,而$("#btn").val("點我")則是給id為"btn"的按鈕賦值。
那么JavaScript是怎么實現(xiàn)(準確地講應該叫“模擬”)的呢?。
答案很簡單:arguments
arguments是JavaScript里的一個內置對象,包含了調用者傳遞的實際參數(shù),但不局限于函數(shù)聲明所定義的參數(shù)列表,而調用時只它和數(shù)組一樣有個length屬性?!?
我們暫且把它當“數(shù)組”來理解吧,我們根據(jù)該數(shù)組的長度以及其元素的類型來選擇不同的實現(xiàn),從而模擬了重載?!?
具體請看下面的示例:
復制代碼 代碼如下:
function getDate(){
if(arguments.length==0){
var date=new Date().toLocaleDateString();
return "您沒有輸入?yún)?shù),現(xiàn)在時間:"+date ;
}
if(arguments.length==1){
if(arguments[0].constructor ==Date){
return "您輸入的參數(shù)是Date類型,現(xiàn)在時間是:"+arguments[0].toDateString();
}
if(arguments[0].constructor ==String){
return "您輸入的參數(shù)是String類型,現(xiàn)在時間是:"+arguments[0];
}
}
}
于是我們可以這樣調用:
getDate()
getDate(new Date())
getDate("星期一")
這樣就實現(xiàn)了JavaScript的重載,不過我們發(fā)現(xiàn)這樣的“實現(xiàn)”實在是太勉強了,如果參數(shù)多了,就會顯得力不從心,代碼也會很亂,到處是if{...} 。所以我不建議在JavaScript中使用這樣的重載。
您可能感興趣的文章:
- javascript函數(shù)重載解決方案分享
- Javascript基礎 函數(shù)“重載” 詳細介紹
- java中重載、覆蓋和隱藏三者的區(qū)別分析
- PHP和JAVA中的重載(overload)和覆蓋(override) 介紹
- JavaScript 通過模式匹配實現(xiàn)重載
- 添加JavaScript重載函數(shù)的輔助方法2
- 為JavaScript添加重載函數(shù)的輔助方法
- Javascript 面向對象之重載
- javascript 面向對象,實現(xiàn)namespace,class,繼承,重載
- JavaScript 的方法重載效果
- 讓 JavaScript 輕松支持函數(shù)重載 (Part 2 - 實現(xiàn))
- 讓JavaScript 輕松支持函數(shù)重載 (Part 1 - 設計)
- java方法重載示例
相關文章
javascript 混合的構造函數(shù)和原型方式,動態(tài)原型方式
JS編程中最常用兩種對象類定義的方式。不管是利用下面2種方式的那一種,都可以達到相同的效果!2009-12-12Javascript 類與靜態(tài)類的實現(xiàn)(續(xù))
由于MM的事件已干完,接著我們的靜態(tài)類的實現(xiàn)。這東西在Javascript里用得會非常的頻繁,因為針對現(xiàn)在的網(wǎng)頁,多個基于同一個類對象的頁面不多,往往不同塊對象的交互就可以解決問題了,這就需要在JS針對元素定義幾個靜態(tài)類就可以完事了,進入正題。2010-04-04JS類定義原型方法的兩種實現(xiàn)的區(qū)別評論很多
JS類定義原型方法的兩種實現(xiàn)的區(qū)別評論很多...2007-09-09