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的闭包,而oldold
对象包含第一个find
。呸
这是一个近似的图形表示:
find -> [ find3 ]
[ old2 --]--> [ find2 ]
[ old1 --]--> [ find1 ]
[ null ]
但是在调用第三个
addMethod
之后,我们有了this.find
指向一个函数,在该函数中,fn
期望参数中有2个参数,old期望参数中有1个参数。在没有争论的情况下会发生什么。这是怎么处理的?