arozwalak
12/23/2013 - 1:42 PM

Javascript: Overloading functions by argument count

Javascript: Overloading functions by argument count

.pass {
  color: green;
}
.fail {
  color: red;
}
function assert(value, desc) {
    var li = document.createElement("li");
    li.className = value ? "pass" : "fail";
    li.appendChild(document.createTextNode(desc));
    document.getElementById("results").appendChild(li);
}

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

var ninjas = { 
values: ["Dean Edwards", "Sam Stephenson", "Alex Russell"]
};

addMethod(ninjas, "find", function(){ 
	return this.values;
});

addMethod(ninjas, "find", function(name){ 
	var ret = [];
	for (var i = 0; i < this.values.length; i++)
	if (this.values[i].indexOf(name) == 0)
		ret.push(this.values[i]);
	return ret;
});

addMethod(ninjas, "find", function(first, last){ 
	var ret = [];
	for (var i = 0; i < this.values.length; i++)
		if (this.values[i] == (first + " " + last))
			ret.push(this.values[i]);
	return ret;
});

assert(ninjas.find().length == 3, 
"Found all ninjas");

assert(ninjas.find("Sam").length == 1,
"Found ninja by first name");

assert(ninjas.find("Dean", "Edwards").length == 1,
"Found ninja by first and last name");

assert(ninjas.find("Alex", "Russell", "Jr") == null,
"Found nothing");
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Overloading functions by argument count" />
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
  <ul id="results"></ul>
</body>
</html>