How to detect a JavaScript function with a certain signature has been registered?

后端 未结 4 1164
抹茶落季
抹茶落季 2021-02-02 01:38

Say you have two functions with the following signatures:

  1. addClass( class )
  2. addClass( class, duration )
相关标签:
4条回答
  • 2021-02-02 01:51

    It isn't very difficult to achieve, but Resig's method isn't up to much, as it only checks for arguments length, which is only tangentially related to real call signatures.

    Johannes method is actually method overriding not multiple call signatures, and anyway will fail in JS Strict mode where multiple function declaration of the same name are forbidden.

    To implement properly you'll need to implement it via call forwarding, wrapping each call signature in a type/existence check:

    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;
        }
    }
    

    It gets a little more complex when some params are optional as well.

    0 讨论(0)
  • 2021-02-02 02:01

    If you are using node you can use func.toString() and parse the result to get the signature that was being used.

    0 讨论(0)
  • 2021-02-02 02:07

    You can use the length property of the function object to check the signature. Example:

    function x(a) {}
    function y(a,b) {}
    
    alert(x.length); // shows "1"
    alert(y.length); // shows "2"
    
    0 讨论(0)
  • 2021-02-02 02:17

    There is no native method overloading in JavaScript. You can create your own, though: http://ejohn.org/blog/javascript-method-overloading/

    (Update 11/5/15: The link seems to be dead, here's the Google Cache version)

    So if you do

    function addClass( class ) { console.log('1 arg'); };
    function addClass( class, duration ) { console.log('2 args'); };
    

    the second one overwrites the first one. So even if you call "addClass(1)", the output will still be "2 args". Same as doing

    someObject.addClass = function(a) {...}
    someObject.addClass = function(a, b) {...}
    

    The first "version" will be lost.

    0 讨论(0)
提交回复
热议问题