zoukankan      html  css  js  c++  java
  • 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"]

      

  • 相关阅读:
    Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint
    Windows Azure Cloud Service (39) 如何将现有Web应用迁移到Azure PaaS平台
    Azure China (7) 使用WebMetrix将Web Site发布至Azure China
    Microsoft Azure News(4) Azure新D系列虚拟机上线
    Windows Azure Cloud Service (38) 微软IaaS与PaaS比较
    Windows Azure Cloud Service (37) 浅谈Cloud Service
    Azure PowerShell (6) 设置单个Virtual Machine Endpoint
    Azure PowerShell (5) 使用Azure PowerShell创建简单的Azure虚拟机和Linux虚拟机
    功能代码(1)---通过Jquery来处理复选框
    案例1.用Ajax实现用户名的校验
  • 原文地址:https://www.cnblogs.com/cyuanwu/p/10199143.html
Copyright © 2011-2022 走看看