Javascriptの関数のlength属性
4561 ワード
各関数にはlength属性(関数名.length)があり、実際に受信したパラメータの個数ではなく、所望の受信関数の個数を表しています.
それはアーグメンントと違っています.argments.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