js实现函数重载

js本身由于其并不检查参数的个数和类型,而是直接把参数放到一个arguments的对象中,由于这种机制我们并不能像c++和java一样去实现函数重载,而要在函数里面去判断参数的个数和类型来间接实现函数重载

function addMethod(object, name, fn){ 
  // Save a reference to the old method 
  var old = object[ name ]; 
 
  // Overwrite the method with our new one 
  object[ name ] = function(){ 
    // Check the number of incoming arguments, 
    // compared to our overloaded function 
    if ( fn.length == arguments.length ) 
      // If there was a match, run the function 
      return fn.apply( this, arguments ); 
 
    // Otherwise, fallback to the old method 
    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; 
  }); 
} 

/*Test*/
ninjas = new Ninjas()
ninjas.find(); //["Dean Edwards", "Sam Stephenson", "Alex Russell"]
ninjas.find("Sam");//["Sam Stephenson"]

 

posted @ 2015-11-30 20:36  Kinthon  阅读(334)  评论(0编辑  收藏  举报