Back in 2007, John Resig published this interesting post on JavaScript method overloading. As he says, it's just a way of mapping a single function call to multiple functions based upon the arguments they accept. After viewing his examples, I started wondering how this method could be included within the namespace of a pre-existing object. This method is as follows:
// addMethod - By John Resig (MIT Licensed) function addMethod(object, name, fn){ var old = object[ name ]; object[ name ] = function(){ if ( fn.length == arguments.length ) return fn.apply( this, arguments ); else if ( typeof old == 'function' ) return old.apply( this, arguments ); }; }
This method accepts three arguments:
object
: an object where methods should be addedname
: the name of the methodfn
: an anonymous function that is actually the body of our method.
First, addMethod()
stores a reference to the target object's method in the private old
variable. Then it creates the body of the new method with an anonymous function. This function checks whether the arguments of the new method and the arguments of the addMethod()
method have the same length. If so, it calls apply()
on the new function. Otherwise, it calls apply()
on the old
reference. Some examples:
function Users(){ addMethod(this, "find", function(){ // Find all users... }); addMethod(this, "find", function(name){ // Find a user by name }); addMethod(this, "find", function(first, last){ // Find a user by first and last name }); }
Practical usage:
var users = new Users(); users.find(); // Finds all users.find("John"); // Finds users by name users.find("John", "Resig"); // Finds users by first and last name users.find("John", "E", "Resig"); // Does nothing
This method is global. A way to reference it within an object would be creating a private method:
function Class() { var that = this; function addMethod (...) { //... }; addMethod(that, 'show', function() {...}); }
However, I have to test it extensively.