JS的重载

什么是重载

相同的函数名,不同参数列表的多个函数在调用时,可以根据传入参数的不同自动选择对应的函数调用,一个函数名执行多个操作。一般会在一个任务根据不同的参数执行不同的流程时使用。

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-namelast-name都匹配的元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值