javascript函数重载操作详细信息
我读过Jhon resig关于函数重载的帖子: 职能:javascript函数重载操作详细信息,javascript,Javascript,我读过Jhon resig关于函数重载的帖子: 职能: 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){ // Fin
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(这是参数)
时,参数长度都会减少1
我使用警报来跟踪功能,这是我无法理解的主要问题
任何帮助都将不胜感激。它有效地导致了一系列的
旧的
函数被一个接一个地调用,直到找到一个其算术匹配参数.length
的函数。因此,在第一次调用addMethod
时,您将得到old
为未定义的
第二次调用addMethod
,old
将成为第一次调用中分配的函数
如果运行此命令:
var users = new Users();
users.find("James");
users.find();
它将查找标识符为find
的users
属性。它将找到一个,该函数的arity为2(因为构造函数中对addMethod
的最后一次调用创建了一个需要2个参数的方法)。因此,它不调用它,而是调用old
,这将是需要1个参数的方法的版本。我们的调用只有一个参数,并且匹配,所以这就是执行的方法
如果运行此命令:
var users = new Users();
users.find("James");
users.find();
它将完全按照我上面描述的那样执行,但是当它调用old
时,该arity将不匹配,它将再次调用old
。在这种情况下,old
的值将是第一次调用addMethod
后的值(这是一个通常称为闭包的东西的演示-在父函数返回后,oldold
函数仍然可用)。它被递减,因为它是这样编写的。第三个find
实现需要3个参数,第二个需要2个参数,第一个可以在没有任何参数的情况下调用。让第三个实现使用5个参数,第二个实现使用3个参数,它将递减2:)MikeM:function(){if(fn.length==arguments.length)返回fn.apply(这是参数);else if(typeof old=='function'){alert(“fn:+fn.length+”参数:+arguments.length);return old.apply(this,arguments);}}如果我理解正确,find(arg1,arg2)的属性old defind为find(arg1,arg2)find(arg1)的旧属性定义为find(),find()的旧属性定义为undefind是正确的吗?是的,我想你明白了,尽管你在注释中犯了一个小错误-find(a1,a2)
有效地将其旧的属性设置为find(a1)
。请注意,您提到的“减量”只是一个副作用,在这种情况下,addMethod
已被调用3次,每次的参数数量都在增加。