跳转到内容
返回

关于js实现重载

本文源码 这里

重载是什么

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

js没有实现重载

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对象版本

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参数版本

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


上一篇
mongoose简单入门
下一篇
关于js模块化
×