在C#中,我可能有一个像这样的重载函数:
public string OverLoad(string str1) {return str1;}
public string OverLoad(string str1, string str2) {return str1+str2;}
我知道JavaScript没有内置对重载函数的支持,但有没有人解决这个问题仍然可以实现重载功能?
我很好奇:
1。)对速度的影响
2。)使用不同功能名称与重载的原因
您似乎可以检查参数是否未定义,并“伪造”JavaScript中的功能。对我来说,通过仅改变参数数量来改变功能的便利性将是非常有利的。
答案 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的数组解构的简写,而不是固定的函数签名。
对速度的影响微乎其微,甚至不考虑。
至于何时执行此操作与何时使用单独的功能,这完全是一个程序清晰度和可用性问题,可能会受到广泛的意见。