实现js中的重载

重载是面向对象语言里很重要的一个特性,JS中没有真正的重载,是模拟出来的(因为js是基于对象的编程语言,不是纯面向对象的,它没有真正的多态:如继承、重载、重写)

一、什么时候用重载?

举例:

function getDataTop10(){
    alert("返回前10条数据");
}

后来需求改了,需要获得20条数据,而getDataTop10又被很多函数调用了,整体替换可以但麻烦,这时可以用重载

进而引出什么是重载:函数名相同,但是可以区分出来,想用哪个就用哪个,而不是后面的同名函数覆盖前面的

二、怎么用?

arguments:Js里的一个内置对象,包含了调用者传递的实际参数(函数声明时定义的参数个数不影响)

function getData(){
    alert("返回所有数据");
}
function getDataTop(num){
    alert("返回前"+num+"数据");
}
function getDataLimit(num1,num2){
    alert("返回前"+num1+"-"+num2+"数据");
}
function getDste(){
    var num=arguments.length;
    if(!num){
	getData();
    }
    else if(num==1){
	getDataTop(arguments[0]);
    }
    else if(num==2){
	getDataLimit(arguments[0],arguments[1]);
    }
}
getDste(5)

 当参数很多时要写一大串,遂可以改进

function getData(){
    alert("返回所有数据");
}
function getDataTop(num){
    alert("返回前"+num+"数据");
}
function getDataLimit(num1,num2){
    alert("返回前"+num1+"-"+num2+"数据");
}
function getDste(){
	var num=arguments.length;
	if(!num){
	    getData();
	}
	else if(num==1){
	    getDataTop.apply(this,arguments);
	}
	else if(num==2){
	    getDataLimit.apply(this,arguments);
	}
}
getDste(5)

 如果参数个数相同,类型不同,又该如何

function getData(){
    alert("返回所有数据");
}
function getDataTop(num){
    alert("返回前"+num+"数据");
}
function getDataLimit(num1,num2){
    alert("返回前"+num1+"-"+num2+"数据");
}
function getDataByType(type){
    alert("将返回"+type+"类型的数据");
}
function getDste(){
    var num=arguments.length;
    if(!num){
	getData();
    }
    else if(num==1){
	if(typeof arguments[0]=="number"){
            getDataTop.apply(this,arguments);
	}
	else{
	    getDataByType.apply(this,arguments);
	}
    }
    else if(num==2){
	getDataLimit.apply(this,arguments);
    }
}
getDste("array")

三、好处

有利于合作开发

四、坏处

“实现”太勉强,如果参数过多,就要很多if语句,显得代码很乱

原文地址:https://www.cnblogs.com/zhangwenkan/p/3954050.html