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

猜你喜欢

转载自blog.csdn.net/wenmin1987/article/details/82830098