Darth_EF 发表于 2020-10-15 00:28:46

js重载函数的一种方案


/**对比两个列表项是否相同
* @param {Array}   a1       要进行比较的数组
* @param {Array}   a2       要进行比较的数组
* @return {Boolean}    返回是否相同
*/
function arrayEqual(a1,a2){
    if(a1.length!=a2.length)return false;
    var i=a1.length;
    for(--i;i>=0;--i){
      if(a1!=a2)return false;
    }
    return true;
}

/**
* 创建重载函数
* @param   {Function} defaultFnc 当没有和实参对应的重载时默认执行的函数
* @return{Function} 函数
* 用 .addOverload 添加重载
*/
function createOlFnc(defaultFnc){
    var rtn=function(){
      var i=arguments.length-1;
      var parameterType=[];
      for(;i>=0;--i){
            parameterType.push(arguments.constructor);
      }
      for(i=rtn.ols.length-1;i>=0;--i){
            if(arrayEqual(parameterType,rtn.ols.parameterType)){
                return rtn.ols.fnc.apply(this,arguments);
            }
      }
      rtn.defaultFnc.apply(this,arguments);
    }
    rtn.ols=[];
    rtn.defaultFnc=defaultFnc;
    /**
    * 添加一个重载
    * @param {Array} parameterType 形参的类型
    * @param {Function} fnc      执行的函数
    */
    rtn.addOverload=function(parameterType,fnc){
       this.ols.push({parameterType:parameterType,fnc:fnc});
    }
    return rtn;
}


使用列
var d=createOlFnc(function(){console.log(123);});
d.addOverload(,function(str){console.log("this is a string: "+str);});
d();//123
d("abcabcabc");//this is a string: abcabcabc

Darth_EF 发表于 2020-10-15 00:34:54

还有一件事,请问怎么给它加注释?
用function关键字声明函数之后,在调用函数的时候编辑器会根据声明时的形参和注释弹出提示。但是如果是像这样写在重载里,调用的时候就看不到注释了。
该怎么给重载加注释呢?
页: [1]
查看完整版本: js重载函数的一种方案