如何检测具有特定签名的JavaScript函数?

时间:2011-01-28 21:51:56

标签: javascript

假设您有两个具有以下签名的功能:

  1. addClass( class )
  2. addClass( class, duration )
  3. 这些人居住在第三方图书馆 (没有猜测哪个!!)

    如果您使用两个参数调用addClass()但仅注册了签名1,则不会出现错误,并且将调用签名1。第二个参数被忽略。

    那么有没有办法检测到已注册了两个参数的签名2

4 个答案:

答案 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()并解析结果以获取正在使用的签名。