JS实现函数重载

仅支持数字和字符串,其他类型的可根据封装的方法思路自行封装

createOverLoad = () => {
  const fnMap = new Map();
  overLoad = (...args) => {
    const key = args.map((it)=> typeof it).join(',');
    const fn = fnMap.get(key);
    if(!fn){
      throw new TypeError('没有找到对应的实现');
    } 
    return fn.apply(this,args);
  }
  overLoad.addImpl = (...args) => {
    const fn = args.pop();
    if(typeof fn !== 'function'){
      throw new TypeError('最后一个参数必须是函数')
    }
    const key = args.join(',');
    fnMap.set(key,fn);
  };
  return overLoad;
}
const getArgsObj = createOverLoad();
getArgsObj.addImpl(()=>{
  console.log('所有')
})
getArgsObj()

const seachPage = (page,size=10)=>{
  console.log('页码')
}
getArgsObj.addImpl('number','number',seachPage)
getArgsObj.addImpl('number',seachPage)
getArgsObj(10)

getArgsObj.addImpl('string',()=>{
  console.log('查姓名')
})
getArgsObj('丽丽')

getArgsObj.addImpl('string','string',()=>{
  console.log('性别')
})
getArgsObj('女','男')

getArgsObj.addImpl('number','string','number',()=>{
  console.log('数字串数字')
})
getArgsObj(10, '串', 20)

// getArgsObj.addImpl('number','string','number',...,()=>{
//   console.log('不同的类型传不同的参数')
// })
// getArgsObj(10, '串', 20,...)

JS实现函数重载_第1张图片

你可能感兴趣的:(javascript,javascript,前端,开发语言)