关于js实现重载

本文源码 这里

重载是什么

定义:函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同

js没有实现重载

1
2
3
4
5
6
7
8
9
10
let calculate={
add(a){
console.log(a);
},
add(a,b){
cosole.log(a+b);
}
};
calculate.add(5);// NaN 因为第二个参数未定义
calculate.add(5,5);// 10
根据上面的例子发现,当有两个重名的方法的时候,会执行后面的那一个

模拟重载

虽然js本身不支持重载,但是我们可以通过 arguments对象rest参数来模拟重载的效果

代码演示

arguments对象版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
let calculate = {
// arguments版本
add_arguments() {
console.log(`arg是数组吗:${arguments instanceof Array}`);
let argCount = arguments.length;
let sum = 0;
switch (argCount) {
// 当传入一个参数的时候,直接返回该值
case 1:
sum = arguments[0];
console.log(`sum=${sum}`);
break;
// 当参数个数大于一个时,进行求和
default:
for (let i in arguments) {
sum += arguments[i];
}
console.log(`sum=${sum}`);
break;
};
return sum;
}
};
calculate.add_arguments(1);//1
calculate.add_arguments(1, 1, 100);//102

rest参数版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

let calculate={
// rest参数版本
add_rest(one, ...arg) {
console.log(`arg是数组吗:${arg instanceof Array}`);
let sum = 0;
// 当传入一个参数的时候,直接返回该值
if (arg.length == 0) {
console.warn('参数只有一个');
console.log(one);
sum = one;
} else {
// 当参数个数大于一个时,进行求和
console.log(`参数有${arg.length+1}个`);
sum = one;
for (let i in arg) {
console.log(arg[i]);
sum += arg[i];
};
console.log(sum);
};
return sum;
}
};
calculate.add_rest(0);//0
calculate.add_rest(0,10);//10

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!