参考:https://www.cnblogs.com/yugege/p/5539020.html
1.直接利用argumens的长度简单判断
function overLoading() {
// 根据arguments.length,对不同的值进行不同的操作
switch(arguments.length) {
case 0:
/*操作1的代码写在这里*/
break;
case 1:
/*操作2的代码写在这里*/
break;
case 2:
/*操作3的代码写在这里*/
//后面还有很多的case......
}
}
2.使用递归的思想
//find方法查找所有名字、first-name匹配的名字、全名匹配的名字
//addMethod用来添加要重载的方法
function addMethod(object, name, fn) {
//把前一次添加的方法存在一个临时变量old里面,第一次为undefined
var old = object[name];//为object添加了一个name属性
object[name] = function() { // 重写object[name]的方法
// 如果调用object[name]方法时,传入的参数个数跟预期的一致,则直接调用
if(fn.length === arguments.length) {
return fn.apply(this, arguments);
// 否则,调用old方法,可能会继续递归下去直到找到匹配的参数列表个数
} else if(typeof old === "function") {
return old.apply(this, arguments);
}
}
}
var people = {
values: ["Dean Edwards", "Alex Russell", "Dean Tom"]
};
/* 下面开始通过addMethod来实现对people.find方法的重载 */
// 不传参数时,返回peopld.values里面的所有元素
addMethod(people, "find", function() {
return this.values;
});
// 传一个参数时,按first-name的匹配进行返回
addMethod(people, "find", function(firstName) {
var ret = [];
for(var i = 0; i < this.values.length; i++) {
if(this.values[i].indexOf(firstName) === 0) {
ret.push(this.values[i]);
}
}
return ret;
});
// 传两个参数时,返回first-name和last-name都匹配的元素
addMethod(people, "find", function(firstName, lastName) {
var ret = [];
for(var i = 0; i < this.values.length; i++) {
if(this.values[i] === (firstName + " " + lastName)) {
ret.push(this.values[i]);
}
}
return ret;
});
// 测试:
console.log(people.find()); //["Dean Edwards", "Alex Russell", "Dean Tom"]
console.log(people.find("Dean")); //["Dean Edwards", "Dean Tom"]
console.log(people.find("Dean Edwards")); //["Dean Edwards"]
3.省略递归
function addMethod(object, name, fn) {
var old = object[name];
object[name + '_' + fn.length] = fn;//结合参数列表长度设置属性名
object[name] = function () {
return object[name + '_' + arguments.length].apply(this, arguments);
}
}