有的时候涉及到一些类似的函数功能,却要起多个函数名的时候确实是很烦,我们知道在java中存在函数重载,那么如何用js实现一个函数重载呢?
const searcher = {}
search.findAll = () => {
console.log("查询所有用户");
}
search.findName = (name) => {
console.log("按照姓名查询用户");
}
search.findFirstandLastName = (firstName,lastName) => {
console.log("按照姓和名查询用户");
}
我们想要:
const searcher = {}
search.find = () => {
console.log("查询所有用户");
}
search.find = (name) => {
console.log("按照姓名查询用户");
}
search.find = (firstName,lastName) => {
console.log("按照姓和名查询用户");
}
可以发现不管怎么调用,传入几个参数都只会打印“按照姓和名查询用户”,被最后一个函数覆盖掉了。
想出用一个办法,当需要调用的时候,先调用这个方法来创建函数,将调用的对象,函数以及函数的实现传入addMethod方法。
const searcher = {}
addMethod(searcher,'find',() => {
console.log("查询所有用户");
});
addMethod(searcher,'find',() => {
console.log("按照姓名查询用户");
});
addMethod(searcher,'find',() => {
console.log("按照姓和名查询用户");
});
searcher.find();
那么接下来就是如何实现这个方法呢?
const searcher = {}
addMethod(searcher,'find',() => {
console.log("查询所有用户");
});
addMethod(searcher,'find',() => {
console.log("按照姓名查询用户");
});
addMethod(searcher,'find',() => {
console.log("按照姓和名查询用户");
});
function addMethod(object,name,fn){
const old = object[name];
object[name] = function(...args){
if(args.length === fn.length){
return fn.apply(this,args);
}
else if(typeof old === 'function'){
return old.apply(this,args);
}
};
}
search.find("hello");
第一次调用:形参数量为0,运行...否则停止。
第二次调用:形参数量为1,运行...否则:
第三次调用:形参数量为2,运行...否则:
最后定格在第三次调用。