我的回答
js中不存在函数重载, 我们可以通过函数的argument参数和高阶函数两者配合实现重载
function showSum() {
//使用arguments对象模拟出重载效果
if (arguments.length == 1)
{
alert(arguments[0] + 1);
}
else if (arguments.length == 2)
{
alert(arguments[0] + arguments[1]);
}
else if (arguments.length == 3)
{
alert(arguments[0] + arguments[1] + arguments[2]);
}
else {
alert('请传入参数!');
}
}
//显示101
showSum(100);
//显示200
showSum(100, 100);
//显示300
showSum(100, 100,100);
参考回答
背景知识
JavaScript 不支持重载的语法,它没有重载所需要的函数签名。ECMAScript 函数不能像传统意义上那样实现重载。而在其他语言(如 Java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。如前所述,ECMAScript 函数没有签名,因为其参数是有包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。
函数重载
重载函数是函数的一种特殊情况,为方便使用,允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数,类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能 —- 重载函数
模拟实现
- 借助流程控制语句
通过判断传入参数的个数,执行相对应的代码块
function toDo(){
switch(arguments.length){
case 0:
/* 代码块0 */
break;
...
case n:
/* 代码块n */
break;
}
}
- 利用闭包特性 addMethod 函数接收 3 个函数:目标对象、目标方法名、函数体,当函数被调用时:
- 先将目标object[name]的值存入变量old中,因此起初old中的值可能不是一个函数;
- 接着向object[name]赋值一个代理函数,并且由于变量old、fnt在代理函数中被引用,所以old、fnt将常驻内存不被回收
function addMethod(object, name, fnt) {
var old = object[name]; // 保存前一个值,以便后续调用
object[name] = function () {
// 向object[name]赋值一个代理函数
// 判断fnt期望接收的参数与传入参数个数是否一致
if (fnt.length === arguments.length)
// 若是,则调用fnt
return fnt.apply(this, arguments);
else if (typeof old === "function")
// 若否,则判断old的值是否为函数
// 若是,则调用old
return old.apply(this, arguments);
};
}
//模拟重载add
var methods = {};
//添加方法,顺序无关
addMethod(methods, "add", function () {
return 0;
});
addMethod(methods, "add", function (a, b) {
return a + b;
});
addMethod(methods, "add", function (a, b, c) {
return a + b + c;
});
//执行
console.log(methods.add()); //0
console.log(methods.add(10, 20)); //30
console.log(methods.add(10, 20, 30)); //60
- 接着向object[name]赋值一个代理函数,并且由于变量old、fnt在代理函数中被引用,所以old、fnt将常驻内存不被回收