在 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
实际上,这个特定示例比 C#在 javascript 中更优雅。未指定的参数在 javascript 中为 “未定义”,在 if 语句中计算为 false。但是,函数定义未传达 p2 和 p3 是可选的信息。如果您需要大量重载,则 jQuery 决定使用一个对象作为参数,例如 jQuery.ajax(options)。我同意他们的观点,这是最重载的功能最强大且清晰可记录的方法,但是我很少需要一个或两个以上的快速可选参数。
编辑:根据 Ian 的建议更改了 IF 测试
JavaScript 中没有实际的函数重载,因为它允许传递任意数量的任何类型的参数。您必须在函数内部检查已传递了多少个参数以及它们是什么类型。