• JavaScript的重载(通过argument.length)


    偶然间在博客园看到的关于js的重载(重载就是一组具有相同名字、不同参数列表,实现不同操作的函数或方法)问题,作为初学者,在看红宝书的时候,记得书中有概念说明js是没有重载的

    所以,觉得有必要把这一段 记录下来

    1)用于理解,使用argument.length判断传入参数的个数

    function Function() {
      // 根据arguments.length,对传入参数的个数进行判断
      switch(arguments.length) {
        case 0:
        {  /*操作1*/
          break;   }  
        case 1:
        {  /*操作2*/
          break;   } 
        case 2:
        { /*操作3*/
              break;   }
       }
    } 

    2)实际使用的写法(不得不说,很精妙)

    //通过addMethod来实现对people.find方法的重载
    function addMethod(object, name, fn) {
      var old = object[name]; //把前一次添加的方法存在一个临时变量old里面
      object[name] = function() { // 重写了object[name]的方法
        // 如果调用object[name]方法时,传入的参数个数跟预期的一致,则直接调用
        if(fn.length === arguments.length) {
          return fn.apply(this, arguments);
        // 否则,判断old是否是函数,如果是,就调用old
        } else if(typeof old === "function") {
          return old.apply(this, arguments);
        }
      }
    }
     
    var people = {
      values: ["Dean Edwards", "Alex Russell", "Dean Tom"]
    };
     
    /* 下面开始通过addMethod来实现对people.find方法的重载 */
     
    // 不传参数时,返回peopld.values里面的所有元素
    addMethod(people, "find", function() {
      return this.values;
    });
     
    // 传一个参数时,按first-name的匹配进行返回
    addMethod(people, "find", function(firstName) {
      var ret = [];
      for(var i = 0; i < this.values.length; i++) {
        if(this.values[i].indexOf(firstName) === 0) {
          ret.push(this.values[i]);
        }
      }
      return ret;
    });
     
    // 传两个参数时,返回first-name和last-name都匹配的元素
    addMethod(people, "find", function(firstName, lastName) {
      var ret = [];
      for(var i = 0; i < this.values.length; i++) {
        if(this.values[i] === (firstName + " " + lastName)) {
          ret.push(this.values[i]);
        }
      }
      return ret;
    });
     
    // 测试:
    console.log(people.find()); //["Dean Edwards", "Alex Russell", "Dean Tom"]
    console.log(people.find("Dean")); //["Dean Edwards", "Dean Tom"]
    console.log(people.find("Dean Edwards")); //["Dean Edwards"]

      

  • 相关阅读:
    Docker搭建redis集群
    PHP中的OPCode和OPCache
    Redis的三种集群模式
    MySQL事务的隔离级别
    Docker镜像分层技术
    为什么 MongoDB 选择B树,Mysql 选择B+树?
    MongoDB的使用
    cesium+vue挖坑展示
    Ceium+Vue踩坑记录
    渲染总结——记录
  • 原文地址:https://www.cnblogs.com/cyuanwu/p/10199143.html
Copyright © 2020-2023  润新知