Javascript中的函数重载

Javascript中的函数重载,javascript,Javascript,在中,有一个用于函数重载的代码,我不知道它是如何工作的: 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 argu

在中,有一个用于函数重载的代码,我不知道它是如何工作的:

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;
  });
}
函数addMethod(对象、名称、fn){
//保存对旧方法的引用
var old=对象[名称];
//用我们的新方法覆盖该方法
对象[名称]=函数(){
//检查传入参数的数量,
//与重载函数相比
if(fn.length==arguments.length)
//如果存在匹配项,请运行该函数
返回fn.apply(这是参数);
//否则,返回到旧方法
else if(typeof old==“函数”)
返回old.apply(这个,参数);
};
}
功能忍者(){
var ninjas=[“迪安·爱德华兹”、“萨姆·斯蒂芬森”、“亚历克斯·拉塞尔”];
addMethod(这个“find”,函数(){
返回忍者;
});
addMethod(此“查找”,函数(名称){
var-ret=[];
for(var i=0;i
  • 为什么第二个
    addMethod
    没有重写第一个
  • 为什么我们需要保留对
    旧的
    的引用

  • 你的两个问题互相回答。第二个
    addMethod
    使用闭包覆盖第一个
    find
    ,由于包含第一个
    find
    old
    对象,如果第二个
    find
    的参数计数不匹配,则能够返回到它

    当对
    addMethod
    的第三次调用完成时,它基本上是递归地做同样的事情。因此它用另一个闭包覆盖闭包,其中
    old
    是对象,函数
    find
    是第二个find的闭包,而old
    old
    对象包含第一个
    find
    。呸

    这是一个近似的图形表示:

    find -> [ find3  ]
            [ old2 --]--> [ find2  ]
                          [ old1 --]--> [ find1 ]
                                        [ null  ]
    

    但是在调用第三个
    addMethod
    之后,我们有了
    this.find
    指向一个函数,在该函数中,
    fn
    期望参数中有2个参数,old期望参数中有1个参数。在没有争论的情况下会发生什么。这是怎么处理的?