Javascript函数重载的最佳和快速方法

Posted

技术标签:

【中文标题】Javascript函数重载的最佳和快速方法【英文标题】:Javascript best & fast way for function overloading 【发布时间】:2021-12-28 04:24:08 【问题描述】:

我编写了以下代码用于在 javascript 中重载函数。 此代码在大型项目上运行缓慢。 还有其他方法可以在 Javascript 中实现重载函数吗? 还有其他更快更实用的方法吗?

(() => 
  //array that store functions
    var Funcs = []
     /**
     * @param function f overload function
     * @param string fname overload function name
   * @param parameters vtypes function parameters type descriptor (number,string,object....etc
     */
    overloadFunction = function(f, fname, ...vtypes) 
        var k,l, n = false;
        if (!Funcs.hasOwnProperty(fname)) Funcs[fname] = [];
        Funcs[fname].push([f, vtypes?vtypes: 0 ]);
        window[fname] = function() 
            for (k = 0; k < Funcs[fname].length; k++)
                if (arguments.length == Funcs[fname][k][0].length) 
                    n=true;
                    if (Funcs[fname][k][1]!=0)
                    for(i=0;i<arguments.length;i++)
                    
                        if(typeof arguments[i]!=Funcs[fname][k][1][i])
                        
                            n=false;
                        
                    
                    if(n) return Funcs[fname][k][0].apply(this, arguments);
                
        
    
)();

//First sum function definition with parameter type descriptors
overloadFunction((a,b)=>return a+b,"sum","number","number")
//Second sum function definition with parameter with parameter type descriptors
overloadFunction((a,b)=>return a+" "+b,"sum","string","string")
//Third sum function definition (not need parameter type descriptors,because no other functions with the same number of parameters
overloadFunction((a,b,c)=>return a+b+c,"sum")

//call first function
console.log(sum(4,2));//return 6
//call second function
console.log(sum("4","2"));//return "4 2"
//call third function
console.log(sum(3,2,5));//return 10
//ETC...

【问题讨论】:

这段代码应该做什么?请不要只说“重载函数”——这已经是问题的一部分。我不明白如何。而且我不想尝试从代码中对解决方案进行逆向工程。因此,我无法猜测实际目标是什么。我也无法提供实现该目标的替代方案。 这能回答你的问题吗? Function overloading in Javascript - Best practices 这个问题的基本答案是:不要。只需以通常的方式编写函数,也许使用默认参数值;或编写具有不同名称的多个函数。如果您确实需要,请接受一个休息参数并根据该参数的长度计算出要做什么。上面有一些问题:你没有声明变量,所以你隐式地创建了全局变量(例如:createFunc),你创建的所有函数也是全局变量,这是不好的做法(全局命名空间已经太拥挤了) , new Array() 写得更好[], ... 我将具有相同名称但不同上下文的函数添加到 Funcs 变量。 Funcs 有自己的范围,并从全局命名空间和全局范围中分离出来。只有一个全局函数可以从函数中调用其他同名函数。 (window[fname] = function() ...). 【参考方案1】:

重载的概念是为了避免使用无限参数的函数。这与你的模式相反。理想情况下,一个函数应该有几个参数。重载函数在重载参数中传递不同的参数。

function overload(fname, arr=[])
 let sum = 0;
 for(let i=0; i<arr.length; i++)
  sum += arr[i];
 
 return fname + sum;


overload("Juan", [1]);

因此, arr 不被视为重载,它的长度不确定。但是如果你有 obj 而不是 arr,你可以不加选择地传递任意数量的类型或值。

function overload(fname, obj=)
 if(obj.arr)
 if(obj.f)


overload("Juan", "arr":[1], "f":true, "infinite":-Infinity);

此重载参数非常适合范围或来源可疑的数据。

【讨论】:

以上是关于Javascript函数重载的最佳和快速方法的主要内容,如果未能解决你的问题,请参考以下文章

方法重载eclipse定义一个图书类

构造函数重载 - Java 中的最佳实践 [关闭]

Java中的构造函数重载 - 最佳实践

C++ 类的多态二(函数重载--函数重写--函数重定义)

浅谈JavaScript--函数重载

JavaScript案列002 函数重载