我们在学习JAVA的时候会注意到一个东西就是方法的重载,虽然前端并没有提供重载的概念,但是我们却可以利用闭包来实现方法重载,用JS实现方法重载也是一个大厂的面试题,今天就来分享一下JS实现重载的一个方法。
一、方法重载的概念及用途
在同一个类中,允许存在一个以上的重名方法,只要它们的参数个数或者参数类型不同即可。
方法的重载可以让我们通过调用同一个方法,根据不同的传参来实现不同的功能,比如一个搜索用户函数,我们可以根据用户的姓,或者姓+名或者直接查询来查询用户,正常的话我们得写三个方法。都是搜索用户函数,只不过根据搜索的传参不同来执行不同的函数,如果写成三个函数的话我们得记住三个函数的名,而且调用也得想一下传参的实际情况。如果用方法重载就不用想这些了,可以直接调用就行,所有的逻辑都写在函数里边。
二、需求分析
首先分析一下需求,是同名,且根据函数参数的个数调用不同的同名函数。因为JS是一个弱类型的语言,所以就只考虑参数的个数这种情形。同名但是根据不同参数的个数来实现调用不同的函数,也就只有闭包能做到了。
三、代码
//第一个参数是要绑定函数的对象,第二个函数是函数的名字,第三个是具体函数
function addMethod(Object, name, fn) { // 具体实现
// 因为方法都是重名的,所以先取出原本的方法
const old = Object[name];
// ...args是形参表示接受所有参数
Object[name] = function (...args) {
// 判断形参个数,如果和传入换上的形参个数一样就执行传入的这个函数
if (args.length === fn.length)
return fn.apply(this, args);
else if (typeof old === 'function')
return old.apply(this, args);
}
}
const searcher = {}
addMethod(searcher, 'find', () => {
console.log('查询所有用户')
})
addMethod(searcher, 'find', (name) => {
console.log('按照姓名查询用户')
})
addMethod(searcher, 'find', (firstname, lastname) => {
console.log('按照姓和名查询用户')
})
searcher.find() // 查询所有用户
searcher.find('lhy') // 按照姓名查询用户
searcher.find('l', 'hy'); // 按照姓和名查询用户
四、总结
以上就是利用闭包实现方法重载的一个方法,其实这个方法也是JQ实现方法重载的一个思路,这个也是JQ之父的一个非常巧妙的一个方法,之后还是要多注意一些其他语言的一些特点,并应用到JS中。其实闭包的用途也是很多的不止今天我分享的方法重载,还有红宝书中提到的利用闭包实现变量私有。利用闭包实现变量私有这个就下次分享吧。