我读了关于函数重载的Jhon resig帖子:
http://ejohn.org/blog/javascript-method-overloading/
功能:
function Users(){
addMethod(this, "find", function(){
// Find all users...
});
addMethod(this, "find", function(name){
// Find a user by name
});
addMethod(this, "find", function(first, last){
// Find a user by first and last name
});
}
// addMethod - By John Resig (MIT Licensed)
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 );
};
}
我理解这个概念。我无法理解的一件事是,每次else if
语句执行return old.apply(this, arguments)
时,为什么参数长度减1。
我使用警报来跟踪功能,这是我无法理解的主要内容。
任何帮助将不胜感激。
答案 0 :(得分:0)
它有效地产生一系列old
函数,这些函数被一个接一个地调用,直到找到一个与arguments.length
匹配的arity。因此,在第一次调用addMethod
时,您最终会old
为undefined
。
第二次拨打addMethod
时,old
将成为第一次通话时分配的功能。
如果你运行:
var users = new Users();
users.find("James");
它将查找标识为users
的{{1}}属性。它将找到一个,该函数的arity将为2(因为构造函数中对find
的最终调用创建了一个需要2个参数的方法)。因此,它不是调用它,而是调用addMethod
,它将是需要1个参数的方法的版本。我们的调用只有一个参数,并且匹配,因此这是执行的方法。
如果你运行:
old
它将完全按照我上面的描述进行操作,但是当它调用users.find();
时,arity将不匹配,它将再次调用old
。 old
在这种情况下的值将是第一次调用old
之后的值(这是一个通常被称为闭包的东西的演示 - 旧的addMethod
函数仍然是在父函数返回后可用。)