Created
April 17, 2011 14:09
-
-
Save arian/924057 to your computer and use it in GitHub Desktop.
Overload functions or methods by the types of the arguments
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Simple use | |
var fn = Function.overload([ | |
['string', 'number', function(name, age){ | |
return name + ' is ' + age + ' years old'; | |
}], | |
[String, function(name){ | |
return 'it is just ' + name; | |
}] | |
]); | |
console.log(fn('arian')); | |
console.log(fn('arian', 20)); | |
console.log(fn(34)); | |
// it is just arian | |
// arian is 20 years old | |
// null | |
// Using with Class | |
var Person = new Class({ | |
initialize: Function.overload([ | |
['string', 'string', function(first, last){ | |
this.first = first; | |
this.last = last; | |
console.log('first: ' + first +' and last: ' + last); | |
}], | |
['string', Number, function(last, age){ | |
this.last = last; | |
this.age = age; | |
console.log('Just the last name: ' + last + ' and you are ' + age + ' years old'); | |
}], | |
function(){ | |
// throw Error('pass at least your last name'); | |
} | |
]) | |
}); | |
new Person('Arian', 'Stolwijk'); | |
new Person('Stolwijk', 20); | |
new Person(); | |
// first: Arian and last: Stolwijk | |
// Just the last name: Stolwijk and you are 20 years old | |
// Uncaught TypeError: pass at least your last name | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Function.overload = function(fns, thisArg){ | |
var dflt = (typeOf(fns[fns.length - 1]) == 'function') ? fns.pop() : null; | |
return function(){ | |
var args = Array.from(arguments), | |
self = thisArg || this; | |
overload: for (var i = 0, l = fns.length; i < l; i++){ | |
var types = fns[i].slice(0, -1), length = types.length, | |
fn = fns[i][length]; | |
if (length != args.length) continue; | |
for (var j = length; j--;){ | |
if ( | |
!(instanceOf(types[j], Type) && instanceOf(args[j], types[j])) | |
&& typeOf(args[j]) != types[j] | |
) continue overload; | |
} | |
return fn.apply(self, args); | |
} | |
return dflt && dflt.apply(self, args); | |
}; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
this is really cool