你在JavaScript中使用“假”函数重载?

时间:2013-03-30 15:17:33

标签: c# javascript performance

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

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

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

我很好奇:

1。)对速度的影响

2。)使用不同功能名称与重载的原因

您似乎可以检查参数是否未定义,并“伪造”JavaScript中的功能。对我来说,通过仅改变参数数量来改变功能的便利性将是非常有利的。

3 个答案:

答案 0 :(得分:4)

在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

的信息

答案 1 :(得分:2)

JavaScript 不支持 支持功能重载。虽然它允许您传递可变数量的参数。

您必须在function内检查传递了多少arguments以及它们的类型。

答案 2 :(得分:2)

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

例如,在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的数组解构的简写,而不是固定的函数签名。

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

至于何时执行此操作与何时使用单独的功能,这完全是一个程序清晰度和可用性问题,可能会受到广泛的意见。