Secrets of the JavaScript Ninjaを読んでいて、関数のオーバーロードを生成する次のコードを見ました。
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 is defined in Listing 2-28
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");
function assert(a,b)
{
if (a==true) console.log(b) ; else console("----");
}
私が理解している限り、はaddMethod
常にold
関数の値を保持します(クロージャーを介して)。
最後に、 条件をチェックする1 つの関数があり、それが失敗した場合は、同じことを行うold
関数を呼び出します。
ただし、 の評価がわかりません(とarguments.length
の違いは知っています)。function().length
argument.length
はどの四角形をarguments
指していますか?
デバッガーで追跡しましたが、最初は関数が登録されているため、混乱しています( arguments.length
3[(object, name, fn)]
ですが、後で呼び出されるため、別の引数があります。
それはどのように機能していますか?