js中函数重载(重载函数)的个人实现

173 阅读1分钟

1.概念

重载函数:函数同名,但是他们的参数类型,数量,顺序不同,完成的功能不同.由于js中没有重载函数,所以需要我们自己来实现.

2.代码

function createOverload{
    const callmap = new Map() // 参数列表和对应函数实现的键值对集合
    // 重载函数
    function overload(...args){
       const key = args.map(arg=> typeof arg).join(',') //[1, 'a'] => ['number','string']
       const fn = callMap.get(key)
       if(fn){
           return fn.apply(this, args)
       }
       throw new Error('no matching function')
    }
    overload.addImpl = function(...args){
        const fn = args.pop() // 拿到传递过来的参数
        if(!fn || typeof fn !== 'function'){
            return
        }
        const types = args // 拿到参数列表
         // 不同参数列表对应不同的函数实现
        callmap.set(types.join(','), fn)
    }
    return overload
}
const getUsers = createOverload ()
getUsers.addImpl(()=>{
    console.log('查询所有用户')
})

const searchPage = (page, size = 10) =>{
    console.log('按照页码和数量查询用户')
}
getUsers.addImpl('number', searchPage)
getUsers.addImpl('number','number',searchPage)
getUsers.addImpl('string',(name)=>{
    console.log('按照姓名用户')
})
getUsers.addImpl('string','string',(sex)=>{
    console.log('按照性别用户')
})
getUsers() // 查询所有
getUsers(1) // 按照页码和数量查询用户
getUsers('a') // 按照姓名用户