Say you have two functions with the following signatures:
addClass( class )
addClass( class, duration )
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.
If you are using node you can use func.toString()
and parse the result to get the signature that was being used.
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"
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.