JavaScript原生不支持方法重载,通常通过判断参数是否为undefined来模拟。本文介绍了两种实现方式:一是手动检查参数数量进行分支处理;二是利用John Resig提出的addMethod函数,通过比较fn.length与arguments.length实现自动匹配,从而简化重载逻辑。
JavaScript方法重载概述
.NET中的方法重载机制十分便捷,那么在JavaScript中是否也能实现类似的功能呢?
JavaScript本身并不具备方法重载的特性。以往常见的做法是直接省略传递参数,随后在函数内部检查参数是否为“undefined”,根据这一状态来决定执行逻辑,以此模拟方法重载的效果。
例如:
代码如下:
var showMessage = function(name,value,id){
if(id != ”undefined”){
alert(name+value+id);
}
else if(value != ”undefined”){
alert(name + value);
}
else{
alert(name);
}
}
showMessage(”哈哈”);
showMessage(”哈哈”,”??”);
showMessage(”哈哈”,”??”,124124);
基于addMethod的重载实现
今日在Ajaxian网站上看到一篇关于JavaScript方法重载的文章,它通过另一个辅助函数来实现这一功能。
看一下这个代码:
代码如下:
// 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 );
}
}
};
var UserInfo = function(){
addMethod(this,”find”,function(){
alert(”没有参数”);
});
addMethod(this,”find”,function(name){
alert(”传入的参数是一个,叫 ”+name);
});
addMethod(this,”find”,function(name,value){
alert(”传入了两个参数,一个叫 name=”+name+” 一个叫 value=”+value);
});
};
var userinfo = new UserInfo();
userinfo.find();
userinfo.find('我是谁?');
userinfo.find('某某某','1512412514');看,这样一来就简单了……