你在 JavaScript 中使用“假”函数重载吗? [复制]

Posted

技术标签:

【中文标题】你在 JavaScript 中使用“假”函数重载吗? [复制]【英文标题】:Do You Use "Fake" Function Overloading In JavaScript? [duplicate] 【发布时间】:2013-03-21 03:33:05 【问题描述】:

在 C# 中,我可能有一个像这样的重载函数:

public string OverLoad(string str1)                  return str1;
public string OverLoad(string str1, string str2)     return str1+str2;

我知道 javascript 没有内置对重载函数的支持,但是有没有人解决这个问题以仍然实现重载函数功能?

我很好奇:

1.) 对速度的影响

2.) 使用不同函数名与重载的原因

您似乎可以检查参数是否未定义并“伪造”JavaScript 中的功能。对我来说,仅通过更改参数数量来轻松更改功能将是一个很大的优势。

【问题讨论】:

JavaScript 不能重载函数 - 它们是 variadic。然而,您可以使用这个更强大的概念来模拟重载函数;另见method overloading in Javascript 【参考方案1】:

在 javascript 中,传递参数的趋势是对象的属性,即有一个参数是对象,因此您可以按任何顺序指定任何内容。使用这种方法,您可以检查“未定义”,并且您的函数可以按照该方法运行。

如果您在不同情况下有相当大的行为,您可以通过将每个情况拆分为一个单独的函数来扩展这个想法,然后由您的主“重载”函数调用。

例如:

function a (params) 
    // do for a

function b () 
    // do for b

function main (obj) 
    if (typeof obj.someparam != 'undefined') 
        a(whatever-params);
     else if (typeof obj.someotherparam != 'undefined') 
        b(whatever-params);
    

您也可以根据数量参数或争论的数量使用相同的方法。您可以阅读有关使用参数here 的信息。

【讨论】:

这并不能回答 OP 关于速度问题的问题。你能补充一下吗?【参考方案2】:

JavaScript 支持函数重载。虽然它允许你传递可变数量的参数。

你必须检查function里面有多少arguments被传递了,它们的类型是什么。

【讨论】:

是的,我意识到没有内置支持,想知道用户是否通过变通方法扩展 JS 功能以自行实现这一点,以及这样做的原因可能是什么。【参考方案3】:

这很常见,甚至没有被注意到。

例如,在 JQuery 中,on() 方法有多个调用签名:

.on( events [, selector ] [, data ], handler(eventObject) )
.on( events [, selector ] [, data ] )

对第一个表单的调用类似于$('sel').on('click', function(e)/*handler*/)。对第二种形式的调用类似于$('sel').on(click: function(e)/*click handler*/, mouseover: function(e)/*mouseover handler*/)。请注意,这演示了 Java/C# 术语中的“多态性”(即不同类型的参数)和“重载”(即可选参数)。

关键字参数(使用单个对象参数模拟)也很常见,例如$.ajax(settings).

所以是的,这在所有地方都完成了,但是您将其称为“重载”是一种类别混淆。 JS 既不是静态类型的,它的函数也没有固定数量的函数参数。在调用时,无论函数声明什么,您都可以根据需要提供尽可能多或尽可能少的参数。您应该将函数声明中的参数列表视为arguments magic variable 数组解构的简写,而不是固定的函数签名。

对速度的影响微乎其微,甚至都不是考虑因素。

至于何时执行此操作与何时使用单独的函数,这完全是程序清晰度和可用性问题,可能需要广泛的意见。

【讨论】:

令人难以置信的答案弗朗西斯。我对静态类型语言的接触有限,所以我不知道实际上将函数归类为“重载”的原因是这些函数如何运行的一般前提。经过更多研究,我同意我犯了一个类别混淆错误,因为我肯定是在考虑固定函数签名。谢谢,你就是那个男人。

以上是关于你在 JavaScript 中使用“假”函数重载吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中重载函数?

python中有函数重载吗

我可以在 RavenDB 中使用构造函数重载吗?

C++中重载加减乘除等运算符的纯虚函数中的返回类型怎么定义??运算符中参数怎么写??

JavaScript函数重载

定义一个js函数,有三个参数,调用的时候,只传递前2个参数,这样可以吗?