Skip to content

Instantly share code, notes, and snippets.

@XoseLluis
Created July 27, 2013 14:06
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save XoseLluis/6094967 to your computer and use it in GitHub Desktop.
JavaScript function overloading based on the number of parameters. http://deploytonenyures.blogspot.com.es/2013/07/javascript-function-overloading.html
//prompted by: http://ejohn.org/blog/javascript-method-overloading/
//baseFn: function that will be used when the overloaded function is invoked with a non matching number of parameters
function overload(baseFn /*, overload1, overload2...*/){
//returns an overload aware function
function buildOverload(baseFn){
var overloads = {
"default": baseFn
};
overloads[baseFn.length] = baseFn;
var overloadedFn = function(){
if (!overloads[arguments.length])
return overloads.default.apply(this, arguments);
else
return overloads[arguments.length].apply(this, arguments);
};
overloadedFn.overloaded = true;
overloadedFn.add = function(fn){
overloads[fn.length] = fn;
};
overloadedFn.remove = function(fnLength){
delete overloads[fnLength];
};
return overloadedFn;
};
baseFn = baseFn || function(){};
if (!baseFn.overloaded)
baseFn = buildOverload(baseFn);
overloads = [].slice.call(arguments, 1);//obtain array from arguments pseudoarray removing the first element
for(var i=0; i<overloads.length; i++){
baseFn.add(overloads[i]);
}
return baseFn;
}
if (typeof module !== "undefined" && module.exports){
exports.overload = overload;
}
var overload = require("./overload.js").overload;
function base(){
console.log("base");
}
function argsToString(pseudoArr){
return [].join.call(pseudoArr, ", ");
}
function oneParam(param1){
console.log("oneParam overload: " + argsToString(arguments));
}
function twoParams(param1, param2){
console.log("twoParams overload: " + argsToString(arguments));
}
function threeParams(param1, param2, param3){
console.log("threeParams overload: " + argsToString(arguments));
}
var overloaded = overload(base, oneParam, twoParams);
overloaded();
overloaded(1);
overloaded(1, 2);
console.log("no 3 params overload, so it will use the default");
overloaded(1, 2, 3);
overload(overloaded, threeParams);
//the above is right equivalent to this:
//overloaded.add(threeParams);
console.log("3 params overload has been added:");
overloaded(1, 2, 3);
console.log("no 5 params overload, so it will use the default");
overloaded(1, 2, 3, 4, 5);
overloaded.remove(3);
console.log("3 params overload has been removed");
console.log("no 3 params overload, so it will use the default");
overloaded(1, 2, 3);
overloaded.add(threeParams);
console.log("3 params overload has been added again");
overloaded(1, 2, 3);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment