javascript面向物件程式設計--多型
方法過載和覆蓋(重寫)
過載:同名方法可以有多個實現,根據引數的型別,引數值,引數個數決定執行行為
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();