Javascriptの関数のlength属性

4561 ワード

各関数にはlength属性(関数名.length)があり、実際に受信したパラメータの個数ではなく、所望の受信関数の個数を表しています.
それはアーグメンントと違っています.argments.lengthは、関数が実際に受信したパラメータの個数を表しています.
 
この機能を利用して、関数のパラメータの個数による負荷を実現できますか?通常の場合、リネーム関数を定義すると前のカバーがどのように解決されますか?
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; 

  }); 

} 
テストコード
 
var ninjas = new Ninjas(); 

assert( ninjas.find().length == 3, "Finds all ninjas" ); 

assert( ninjas.find("Sam").length == 1, "Finds ninjas by first name" ); 

assert( ninjas.find("Dean", "Edwards").length == 1, "Finds ninjas by first and last name" ); 

assert( ninjas.find("Alex", "X", "Russell") == null, "Does nothing" );
参考:http://ejohn.org/apps/learn/#90