闭包的应用———原生js实现方法的重载

文章介绍了JavaScript中如何通过闭包实现类似方法重载的功能,允许同名函数根据参数个数执行不同逻辑。作者提供了实现代码示例,展示了如何创建一个工具函数`addMethod`来绑定和处理不同参数数量的同名方法,并在实际示例中应用了这个概念。
摘要由CSDN通过智能技术生成


我们在学习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中。其实闭包的用途也是很多的不止今天我分享的方法重载,还有红宝书中提到的利用闭包实现变量私有。利用闭包实现变量私有这个就下次分享吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值