首先js不能像其他语言那样在传统意义上实现重载,如在java中,可以为函数编写2个定义,只要这2个定义的签名(接收的参数的类型和数量)不同既可,
js 函数没有签名,因为其参数是由包含0或多个值的数组来表示的,没有函数签名,重载是实现不了的、
深入理解:函数名是指针,保存着对堆内存中的对象的引用,
有2个同名的函数名时,后面一个函数名就会覆盖。
function addNumber(num){
return num+100;
}
function addNumber(num){
return num+200;
}
var result=addNumber(100);//300
因为函数重载是根据定义函数签名(接收的参数的类型和数量)来实现的实现函数重载,即只要检测传入函数的参数类型和数量既可
var someNum=function(){
if(arguments.length==1){
console.log( arguments[0]+100);
}else if(arguments.length==2){
console.log( arguments[0]+arguments[1]+100);
}
};
someNum(100);
someNum(100,100);
还有更好的方法实现函数重载
我们一起来分析一个这个addMethod函数,它接收3个参数,第一个为要绑定方法的对象,第二个为绑定的方法名称,第三个为需要绑定的方法(一个匿名函数)。函数体的的分析已经在注释里面了。
function addMethod(object, name, fn) {
var old = object[name]; //把前一次添加的方法存在一个临时变量old里面
object[name] = function() { // 重写了object[name]的方法
// 如果调用object[name]方法时,传入的参数个数跟预期的一致,则直接调用
if(fn.length === arguments.length) {
return fn.apply(this, arguments);
// 否则,判断old是否是函数,如果是,就调用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"]