在 Javascript 中伪造函数重载的最佳方法是什么?
我知道不可能像在其他语言中那样在 Javascript 中重载函数。如果我需要一个函数有两个用途foo(x)
和foo(x,y,z)
这是最好的/优选的方法:
- 首先使用不同的名称
- 使用可选参数,如
y = y || 'default'
- 使用参数数量
- 检查参数类型
- 或者怎么做?
在 Javascript 中伪造函数重载的最佳方法是什么?
我知道不可能像在其他语言中那样在 Javascript 中重载函数。如果我需要一个函数有两个用途foo(x)
和foo(x,y,z)
这是最好的/优选的方法:
y = y || 'default'
使用参数进行函数重载的最佳方法是不检查参数长度或类型;检查类型只会使您的代码变慢,并且您会享受数组、空值、对象等的乐趣。
大多数开发人员所做的是将一个对象作为他们方法的最后一个参数。这个对象可以容纳任何东西。
function foo(a, b, opts) {
// ...
if (opts['test']) { } //if test param exists, do something..
}
foo(1, 2, {"method":"add"});
foo(3, 4, {"test":"equals", "bar":"tree"});
然后你可以在你的方法中以任何你想要的方式处理它。[开关,if-else等]
我经常这样做:
C#:
public string CatStrings(string p1) {return p1;}
public string CatStrings(string p1, int p2) {return p1+p2.ToString();}
public string CatStrings(string p1, int p2, bool p3) {return p1+p2.ToString()+p3.ToString();}
CatStrings("one"); // result = one
CatStrings("one",2); // result = one2
CatStrings("one",2,true); // result = one2true
JavaScript 等效项:
function CatStrings(p1, p2, p3)
{
var s = p1;
if(typeof p2 !== "undefined") {s += p2;}
if(typeof p3 !== "undefined") {s += p3;}
return s;
};
CatStrings("one"); // result = one
CatStrings("one",2); // result = one2
CatStrings("one",2,true); // result = one2true
这个特殊的例子实际上在 javascript 中比在 C# 中更优雅。未指定的参数在 javascript 中为“未定义”,在 if 语句中计算为 false。但是,函数定义并没有传达 p2 和 p3 是可选的信息。如果需要大量重载,jQuery 已经决定使用一个对象作为参数,例如 jQuery.ajax(options)。我同意他们的观点,这是最强大且可清晰记录的重载方法,但我很少需要超过一两个快速可选参数。
编辑:根据 Ian 的建议更改 IF 测试
JavaScript 中没有真正的函数重载,因为它允许传递任意数量的任意类型的参数。您必须在函数内部检查传递了多少参数以及它们的类型。
正确答案是在 JAVASCRIPT 中没有重载。
功能内部的检查/切换不是过载。
重载的概念:在某些编程语言中,函数重载或方法重载是创建多个具有不同实现的同名方法的能力。对重载函数的调用将运行适合调用上下文的该函数的特定实现,允许一个函数调用根据上下文执行不同的任务。
例如, doTask() 和 doTask(object O) 是重载方法。要调用后者,必须将对象作为参数传递,而前者不需要参数,并且使用空参数字段调用。一个常见的错误是在第二个方法中为对象分配一个默认值,这将导致不明确的调用错误,因为编译器不知道使用这两个方法中的哪一个。
https://en.wikipedia.org/wiki/Function_overloading
所有建议的实现都很棒,但说实话,JavaScript 没有本机实现。
有两种方法可以更好地解决这个问题:
如果您想留下很大的灵活性,则传递字典(关联数组)
以对象为参数,使用基于原型的继承来增加灵活性。