javascript函数重载操作细节

时间:2013-01-29 15:02:40

标签: javascript

我读了关于函数重载的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。

我使用警报来跟踪功能,这是我无法理解的主要内容。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

它有效地产生一系列old函数,这些函数被一个接一个地调用,直到找到一个与arguments.length匹配的arity。因此,在第一次调用addMethod时,您最终会oldundefined

第二次拨打addMethod时,old将成为第一次通话时分配的功能。

如果你运行:

var users = new Users();
users.find("James");

它将查找标识为users的{​​{1}}属性。它将找到一个,该函数的arity将为2(因为构造函数中对find的最终调用创建了一个需要2个参数的方法)。因此,它不是调用它,而是调用addMethod,它将是需要1个参数的方法的版本。我们的调用只有一个参数,并且匹配,因此这是执行的方法。

如果你运行:

old

它将完全按照我上面的描述进行操作,但是当它调用users.find(); 时,arity将不匹配,它将再次调用oldold在这种情况下的值将是第一次调用old之后的值(这是一个通常被称为闭包的东西的演示 - 旧的addMethod函数仍然是在父函数返回后可用。)