1. 程式人生 > >javascript面向物件程式設計--多型

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();