在Java等語言裏面實現函數的重載是比較簡單的,參數數量不同就能實現同名函數的重載,而JavaScript中的參數本質上還是arguments這個類數組的引用,不能直接更具參數數量的不同而達到重載,這裏使用的閉包實現函數重載:一層一層去尋找合適的函數去執行,代碼如下:
function setOverload(target, fn) {
//注意,target只是原函數的引用,修改這個引用不會直接修改原函數,所以return
var oldTarget = target;
target = function(){
if (arguments.length === fn.length) {
return fn.apply(this, arguments);
} else {
//如果參數數量不符,就繼續往原來的函數上去執行
return oldTarget.apply(this, arguments);
}
};
return target;
}
//測試函數
function method(){
return "沒找到對應重載";
}
method = setOverload(method, function(a){return a;});
method = setOverload(method, function(a,b){return a+b;});
method = setOverload(method, function(a,b,c){return a+b+c;});
console.log(method(1));//1
console.log(method(1,2));//3
console.log(method(1,2,3));//6
console.log(method(1,2,3,4));//沒找到對應重載