方法重载和覆盖(重写)
重载:同名方法可以有多个实现,根据参数的类型,参数值,参数个数决定执行行为
var map=function(arr,callback,pThis){
var len=arr.length;
var rlt=new Array(len);
for(var i=0;i<len;i++){ if(i in arr) rlt[i]=callback.call(pThis,arr[i],i,arr);}
return rlt
}
//默认的dispatcher支持* ... ?其中*表示一个任意类型的参数,...表示多个任意类型的参数,',?...' 表示0个或任意多个参数
//dispatcher用来匹配参数负责派发的函数 func_maps根据匹配接受调用的函数列表
var FunctionH={
overload:function(dispatcher,func_maps){
if(!(dispatcher instanceof Function)){
func_maps=dispatcher;
dispatcher=function(args){
var ret=[];
return map(args,function(o){return typeof o}).join();
}
}
return function(){
var key=dispatcher([],slice.apply(arguments));
for(var i i func_maps){
var pattern=new RegExp('^'+i.replace('*','[^,]*').replace('...','.*')+'$');
if(pattern.test(key)){return func_maps[i].apply(this,arguments)}
}
}
}
};
var Calculate=FunctionH.overload({
'number,number':function(){
return arguments[0]+arguments[1];
},
'number,number,number':function(){
return arguments[0]*arguments[1]*argument[2];
}
});
alert(Calculate(1,2,3));
2--设计一个浏览器兼容的重载函数
var MSIE=navigator.userAgent.indexOf('MSIE')!=-1;
var foo=FunctionH.overload(function(){
return MSIE?'IE':'NotIE';
},{
'IE':function(){alert('this is ie')},
'NotIE':function(){alert('notie')}
})
foo();