在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));//没找到对应重载