zoukankan      html  css  js  c++  java
  • javascript高级知识点——函数的长度

    代码信息来自于http://ejohn.org/apps/learn/。

    函数的长度属性如何工作?

    function makeNinja(name){} 
    function makeSamurai(name, rank){} 
    console.log( makeNinja.length == 1, "只定义了一个形参" ); 
    console.log( makeSamurai.length == 2, "定义了两个形参" );

    很清楚,函数的长度就是定义形参的个数。

    我们可以利用这一点写重载函数

    function addMethod(object, name, fn){ 
      // 存储对过去方法的引用
      var old = object[ name ]; 
     
      // 重写新的方法
      object[ name ] = function(){ 
        // 核对定义形参的个数, 
        // 与我们接受接收参数的个数
        if ( fn.length == arguments.length ) 
          // 如果匹配运行这个函数
          return fn.apply( this, arguments ); 
     
        // 否则调用过去的方法
        else if ( typeof old === "function" ) 
          return old.apply( this, arguments ); 
      }; 
    }

    来看一看重载函数的运用

    function addMethod(object, name, fn){ 
      // 存储对过去方法的引用
      var old = object[ name ]; 
     
      // 重写新的方法
      object[ name ] = function(){ 
        // 核对定义形参的个数, 
        // 与我们接受接收参数的个数
        if ( fn.length == arguments.length ) 
          // 如果匹配运行这个函数
          return fn.apply( this, arguments ); 
     
        // 否则调用过去的方法
        else if ( typeof old === "function" ) 
          return old.apply( this, arguments ); 
      }; 
    }
     
    function Ninjas(){ 
      var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell" ]; 
      addMethod(this, "find", function(){ 
        return ninjas; 
      }); 
      addMethod(this, "find", function(name){ 
        var ret = []; 
        for ( var i = 0; i < ninjas.length; i++ ) 
          if ( ninjas[i].indexOf(name) == 0 ) 
            ret.push( ninjas[i] ); 
        return ret; 
      }); 
      addMethod(this, "find", function(first, last){ 
        var ret = []; 
        for ( var i = 0; i < ninjas.length; i++ ) 
          if ( ninjas[i] == (first + " " + last) ) 
            ret.push( ninjas[i] ); 
        return ret; 
      }); 
    } 
     
    var ninjas = new Ninjas(); 
    console.log( ninjas.find()); 
    console.log( ninjas.find("Sam")); 
    console.log( ninjas.find("Dean", "Edwards")); 
    console.log( ninjas.find("Alex", "X", "Russell"));

    实例化ninja时,向ninja执行了4次添加方法,每次都覆盖在find属性上,根据闭包的作用域链,新的方法仍然可以引用addMethod里old,old保存的是上一个方法。

    最后的find就是判断参数,与形参数量是否相同,是就执行,不是就调用old的方法。如此反复。

    等同于以下代码

    var ninjas = {
        find: function(){
            var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell"] 
            var old = function(){
                var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell"] 
                var old = function(){
                    var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell"] 
                    var old;
                    var fn =   function(){ 
                        return ninjas; 
                      }
                    if ( fn.length == arguments.length ) {
                      return fn.apply( this, arguments ); 
                    }else if ( typeof old === "function" ) {
                      return old.apply( this, arguments ); 
                    }
                };
                var fn =  function(name){ 
                    var ret = []; 
                    for ( var i = 0; i < ninjas.length; i++ ) 
                      if ( ninjas[i].indexOf(name) == 0 ) 
                        ret.push( ninjas[i] ); 
                    return ret; 
                  }
                if ( fn.length == arguments.length ) {
                  return fn.apply( this, arguments ); 
                }else if ( typeof old === "function" ) {
                  return old.apply( this, arguments ); 
                }
            }
            var fn =  function(first, last){ 
                var ret = []; 
                for ( var i = 0; i < ninjas.length; i++ ) 
                  if ( ninjas[i] == (first + " " + last) ) 
                    ret.push( ninjas[i] ); 
                return ret; 
            }
            if ( fn.length == arguments.length ) {
              return fn.apply( this, arguments ); 
            }else if ( typeof old === "function" ) {
              return old.apply( this, arguments ); 
            }
        },
    }
    console.log( ninjas.find()); 
    console.log( ninjas.find("Sam")); 
    console.log( ninjas.find("Dean", "Edwards")); 
    console.log( ninjas.find("Alex", "X", "Russell"));
  • 相关阅读:
    mybatis-plus 相关
    Nginx 相关
    Docker 相关
    shiro & jwt
    Java GC
    C++ Q&A
    epoll ET & LT
    关于 free 命令显示内存使用情况问题
    Metaprogramming in Ruby: It’s All About the Self
    On The Value Of Fundamentals In Software Development (基础知识在软件开发中的价值)
  • 原文地址:https://www.cnblogs.com/winderby/p/4074323.html
Copyright © 2011-2022 走看看