鱼C论坛

 找回密码
 立即注册
查看: 3721|回复: 3

[作品展示] js重载函数(静态多态)

[复制链接]
发表于 2021-5-24 18:09:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
话不多说,直接上代码
Javascript

  1. /** 重载函数类 请使用 OlFunction.create 函数 */
  2. class OlFunction{
  3.     /** @type {Array<{parameterType:parameterType,fnc:fnc,codeComments:codeComments}>} 重载函数 */
  4.     ols=[];
  5.     /** @type {Function} */
  6.     defaultFnc;
  7.     constructor(){
  8.         console.error("使用 OlFunction.create()");
  9.     }
  10.     /**
  11.      * 添加一个重载
  12.      * @param {Array} parameterType   形参的类型
  13.      * @param {Function}    fnc             执行的函数
  14.      * @param {String}      codeComments    函数的注释, 并没有什么用的参数
  15.     */
  16.     addOverload(parameterType,fnc,codeComments){
  17.         this.ols.push({parameterType:parameterType,fnc:fnc,codeComments:codeComments});
  18.     }
  19.     /**
  20.      * 创建重载函数
  21.      * @param   {Function} defaultFnc 当没有和实参对应的重载时默认执行的函数
  22.      * @return  {OlFunction} 带重载的函数
  23.      * 用 .addOverload 添加重载
  24.      */
  25.     static create(defaultFnc){
  26.         var OverloadFunction=(function(){
  27.             return function(){
  28.                 var i=arguments.length-1,j,flag=false;
  29.                 for(i=OverloadFunction.ols.length-1;i>=0;--i){
  30.                     if(arguments.length==OverloadFunction.ols[i].parameterType.length){
  31.                         flag=true;
  32.                         for(j=arguments.length-1;flag&&j>=0;--j){
  33.                             flag=(arguments[j].constructor==OverloadFunction.ols[i].parameterType[j]||arguments[j] instanceof OverloadFunction.ols[i].parameterType[j]);
  34.                         }
  35.                         if(flag)break;
  36.                     }
  37.                 }
  38.                 if(flag){
  39.                     return OverloadFunction.ols[i].fnc.apply(this,arguments);
  40.                 }
  41.                 else{
  42.                     return OverloadFunction.defaultFnc.apply(this,arguments);
  43.                 }
  44.             }
  45.         })();
  46.         OverloadFunction.ols=[];
  47.         OverloadFunction.defaultFnc=defaultFnc;
  48.         OverloadFunction.addOverload=OlFunction.prototype.addOverload;
  49.         return OverloadFunction;
  50.     }
  51. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-24 18:10:32 | 显示全部楼层
  1. // 使用例

  2. Vector2.baseLinearMapping=OlFunction.create();
  3. /**
  4. * 行向量后乘矩阵
  5. */
  6. Vector2.baseLinearMapping.addOverload([Vector2,Matrix2x2],function(v,m){
  7.     var rtn = new Vector2(
  8.         v.x*m.a+v.y*m.c,
  9.         v.x*m.b+v.y*m.d
  10.     )
  11.     return rtn;
  12. },"行向量后乘矩阵");
  13. /**
  14. * 矩阵后乘列向量
  15. */
  16. Vector2.baseLinearMapping.addOverload([Matrix2x2,Vector2],function(m,v){
  17.     var rtn = new Vector2(
  18.         v.x*m.a+v.y*m.b,
  19.         v.x*m.c+v.y*m.d
  20.     );
  21.     return rtn;
  22. },"矩阵后乘列向量");
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-25 08:30:43 From FishC Mobile | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-26 14:58:40 | 显示全部楼层

  1. /**
  2. * 将时间类型转换成字符串
  3. */
  4. (function(){
  5. var temp=Date.prototype.toString;
  6. Date.prototype.toString=OlFunction.create(temp);
  7. /**
  8. * @param {String} str 用%{控制字符}{长度}控制打印字符: Y-年 M-月 D-日 d-星期几 h-小时 m-分钟 s-秒 如果没有写长度将使用自动长度, 如果长度超出将在前面补0; 例: %Y6-%M2-%D -> 001970-01-1
  9. */
  10. Date.prototype.toString.addOverload([String],function(str){
  11.     var that=this,
  12.     d={
  13.         Y:that.getFullYear().toString(),
  14.         M:(that.getMonth()+1).toString(),
  15.         D:that.getDate().toString(),
  16.         d:that.getDay().toString(),
  17.         h:that.getHours().toString(),
  18.         m:that.getMinutes().toString(),
  19.         s:that.getSeconds().toString()
  20.     }
  21.     var i,rtn=[],tstr;
  22.     for(i=0;i<str.length;++i){
  23.         if(str[i]=='%'){
  24.             ++i;
  25.             if(d[str[i]]!=undefined){
  26.                 var ti=parseInt(str[i+1]),tempstr=[];
  27.                 if(isNaN(ti)){
  28.                     tstr=d[str[i]];
  29.                 }else{
  30.                     ti=parseInt(str.slice(i+1))
  31.                     if(ti>d[str[i]].length){
  32.                         do{
  33.                             tempstr.push('0');
  34.                             --ti;
  35.                         }while(ti>d[str[i]].length)
  36.                     }
  37.                     tempstr.push(d[str[i]].slice(d[str[i]].length-ti));
  38.                     i+=ti.toString().length;
  39.                     tstr=tempstr.join('');
  40.                 }
  41.             // }else if(str[i]=='%'){
  42.             //     tstr='%'
  43.             }else{
  44.                 tstr='%'+str[i];
  45.             }
  46.         }else{
  47.             tstr=str[i];
  48.         }
  49.         rtn.push(tstr);
  50.     }
  51.     return rtn.join('');
  52. },"用%{控制字符}{长度}控制打印字符: Y-年 M-月 D-日 d-星期几 h-小时 m-分钟 s-秒 如果没有写长度将使用自动长度; 例: %Y-%M2-%D -> 1970-01-1");
  53. })();
复制代码


使用例2 重载Date的toString函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 07:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表