什么是重载
相同的函数名,不同参数列表的多个函数在调用时,可以根据传入参数的不同自动选择对应的函数调用,一个函数名执行多个操作。一般会在一个任务根据不同的参数执行不同的流程时使用。
function pay(){
console.log(typeof(arguments));
if(arguments.length == 0)
console.log('扫码支付')
else if(arguments.length == 1)
console.log("现金支付" + arguments[0]);
else if(arguments.length == 2)
console.log('刷卡支付,卡号:'+arguments[0]);
}
pay();
pay(100);
pay("1111268686","123456");
从上面的代码中我们可以得知当我们不传参的时候显示的是扫码支付,传入一个参是现金支付,两个参是刷卡支付。不同的参数执行不同的流程
但是JS语法不支持重载效果,不允许多个重名函数存在,就算存在也会被覆盖掉。于是就有了如下两种解决方案
1.arguments对象
argument是专门保存传入函数的所有参数值的类数组对象,类数组对象与数组相同的地方在于类数组也是以下标访问,有length属性用for循环遍历;不同之处在于类数组对象是Object
不是Array
,无法使用Array的API
function sum(){
var sum=0;
// 判断arguments是否有参数
if(arguments.length>0){
// 将参数累加
for(var i =0;i<arguments.length;i++){
sum += arguments[i];
}
}
return sum;
}
console.log(sum(),sum(10,20,30),sum(20,90),sum(1,2,3,5,6,8))
因为js语法不支持重载效果,也不允许多个重名函数存在,于是就用到了arguments对象,在所有函数对象内,都自动创建了一个arguments对象
2.addMethod方法
这个其实和第一个方法差不多,也是用的传参的方式
function addMethod(object, name, fn) {
var temp = object[name];
object[name] = function() {
if(fn.length === arguments.length) {
return fn.apply(this, arguments);
} else if(typeof temp === "function") {
return temp.apply(this, arguments);
}
}
}
var people = {
star: ["Nicholas zhaosi", "Benjamin liuneng", "Alexander xieshufen", "Nicholas vollerei", "Alexander rossweisse"]
};
/* 下面开始通过addMethod来实现对people.find方法的重载 */
addMethod(people, "find", function() {
return this.star;
});
addMethod(people, "find", function(firstName) {
var result = [];
for(var i = 0; i < this.star.length; i++) {
if(this.star[i].indexOf(firstName) === 0) {
result.push(this.star[i]);
}
}
return result;
});
addMethod(people, "find", function(firstName, lastName) {
var result = [];
for(var i = 0; i < this.star.length; i++) {
if(this.star[i] === (firstName + " " + lastName)) {
result.push(this.star[i]);
}
}
return result;
});
// 测试:
console.log(people.find()); //["Nicholas zhaosi", "Benjamin liuneng", "Alexander xieshufen","Nicholas vollerei","Alexander rossweisse"]
console.log(people.find("Alexander")); //["Alexander xieshufen", "Alexander rossweisse"]
console.log(people.find("Alexander xieshufen")); //["Alexander xieshufen"]
这个函数,它可以传三个参数,第一个为要绑定方法的对象,第二个为绑定的方法名称,第三个为需要绑定的方法。当我们不传参时返回people.star
里的所有元素,传一个参时按first-name的匹配进行返回,传两个参时返回first-name
和last-name
都匹配的元素。