假设您有两个具有以下签名的功能:
addClass( class )
addClass( class, duration )
这些人居住在第三方图书馆 (没有猜测哪个!!) 。
如果您使用两个参数调用addClass()
但仅注册了签名1,则不会出现错误,并且将调用签名1。第二个参数被忽略。
那么有没有办法检测到已注册了两个参数的签名2 ?
答案 0 :(得分:27)
您可以使用函数对象的length
属性来检查签名。例如:
function x(a) {}
function y(a,b) {}
alert(x.length); // shows "1"
alert(y.length); // shows "2"
答案 1 :(得分:8)
JavaScript中没有本机方法重载。不过,您可以创建自己的:http://ejohn.org/blog/javascript-method-overloading/
(2015年11月5日更新:链接似乎已经死了,这里是Google Cache version)
所以,如果你这样做
function addClass( class ) { console.log('1 arg'); };
function addClass( class, duration ) { console.log('2 args'); };
第二个覆盖第一个。所以即使你调用“addClass(1)”,输出仍然是“2 args”。与做
相同someObject.addClass = function(a) {...}
someObject.addClass = function(a, b) {...}
第一个“版本”将丢失。
答案 2 :(得分:3)
实现起来并不困难,但Resig的方法并不多,因为它只检查参数长度,这只与实际呼叫签名相关。
Johannes方法实际上是覆盖不是多个调用签名的方法,并且无论如何都会在JS Strict模式下失败,其中禁止使用相同名称的多个函数声明。
要正确实施,您需要通过呼叫转发实现它,将每个呼叫签名包装在类型/存在检查中:
function myFunction(arg1, arg2, arg3){
switch(true){
case arg1 instanceof someObject:
myFunction_signature1.apply(this, arguments);
break;
case typeof arg1 === "string":
myFunction_signature2.apply(this, arguments);
break;
}
}
当某些参数也是可选的时,它会变得更复杂。
答案 3 :(得分:0)
如果您正在使用节点,则可以使用func.toString()
并解析结果以获取正在使用的签名。