国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

讓JavaScript 輕松支持函數重載 (Part 1 - 設計)

2024-05-06 14:14:33
字體:
來源:轉載
供稿:網友
JavaScript支持重載嗎?
JavaScript支持函數重載嗎?可以說不支持,也可以說支持。說不支持,是因為JavaScript不能好像其它原生支持函數重載的語言一樣,直接寫多個同名函數,讓編譯器來判斷某個調用對應的是哪一個重載。說支持,是因為JavaScript函數對參數列表不作任何限制,可以在函數內部模擬對函數重載的支持。
實際上,在很多著名的開源庫當中,我們都可以看到函數內部模擬重載支持的設計。例如說jQuery的jQuery.extend方法,就是通過參數類型判斷出可選參數是否存在,如果不存在的話就對參數進行移位以確保后面的邏輯正確運行。我相信很多人在寫JavaScript時也寫過類似的代碼,以求為功能豐富的函數提供一個(或多個)簡單的調用入口。
不過做種做法一個根本的問題,那就是違反了DRY原則。每個支持重載的函數內部都多出來一段代碼,用于根據參數個數和參數類型處理重載,這些代碼暗含著重復的邏輯,寫出來卻又每一段都不一樣。此外,這些代碼要維護起來也不容易,因為閱讀代碼時你并不能一眼看出函數支持的幾種重載方式是什么,要對重載做出維護自然也困難。
描述重載入口的DSL
我希望能夠在JavaScript中以一種簡單的方式來描述重載入口。最好就如同在其它語言中一樣,使用函數簽名來區分重載入口,因為我認為函數簽名就是這方面最好的DSL。我假想中最符合JavaScript語法的重載入口描述DSL應該是這樣子的:
代碼如下:
var sum = new Overload();
sum.add("Number, Number",
function(x, y) { return x + y; });
sum.add("Number, Number, Number",
function(x, y, z) { return x + y + z; });

在描述好重載入口與對應函數體后,對sum函數的調用應該是這樣子的:
sum(1, 2);
sum(1, 2, 3);
上述代碼在我看來非常清晰,也非常容易維護——你可以一眼看得出重載入口的簽名,并且要修改或者增加重載入口都是很容易的事情。但是我們遇到了一個問題,那就是JavaScript里面的函數是不能new出來的,通過new Overload()獲得的對象一定不能被調用,為此我們只能把Overload做成一個靜態類,靜態方法返回的是Function實例:
代碼如下:
var sum = Overload
.add("Number, Number",
function(x, y) { return x + y; })
.add("Number, Number, Number",
function(x, y, z) { return x + y + z; });

必要的重載入口支持
想象一下,有哪些常見的JavaScript函數入口是用上述DSL無法描述的?我所知道的有兩種:
任意類型參數
假想我們要寫一個each函數,對于Array就迭代它的下標,對于其它類型就迭代它的所有成員,這兩個函數入口的參數列表如何聲明?如果用C#,我們會如此描述兩個函數入口:
void Each(IEnumerable iterator) { }
void Each(object iterator) { }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 宁陕县| 开封县| 万全县| 中江县| 获嘉县| 昌都县| 阳谷县| 呼图壁县| 巴东县| 寻甸| 昆山市| 蚌埠市| 巩义市| 莱州市| 平邑县| 东辽县| 沂水县| 平湖市| 武安市| 武隆县| 青冈县| 新田县| 涿州市| 阿拉善左旗| 丰都县| 江北区| 册亨县| 澎湖县| 山阴县| 额尔古纳市| 安福县| 蒙自县| 泾阳县| 昌邑市| 班玛县| 桂东县| 静海县| 宁强县| 丽江市| 宾阳县| 合川市|