JS实现重载有什么好方法

昵称已存在吗 2018-07-01 10:59:44
如题,JS实现重载有什么好方法
...全文
168 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_42374714 2018-07-03
  • 打赏
  • 举报
回复
可以用switch判断传入参数的个数,然后分别处理嘛
ambit_tsai-微信 2018-07-01
  • 打赏
  • 举报
回复
详见“JS方法/函数重载的姿势”:https://blog.csdn.net/ambit_tsai/article/details/80579903#t3

/**
* 重载工具函数
* @param {object} ctx - 上下文
* @param {string} name - 函数名
* @param {function} fn - 函数体
* @param {string} type - 参数类型
* @author 范围兄 <ambit_tsai@qq.com>
* @example 不指定参数类型
* overload(obj, 'do', function(){...});
* overload(obj, 'do', function(a){...});
* @example 指定参数类型
* overload(obj, 'do', function(a,b){...}, 'string,number');
*/
function overload(ctx, name, fn, type){
type = type? type.trim().toLowerCase(): fn.length;
// 已重载过
if(typeof ctx[name]==='function' && typeof ctx[name]._$fnMap==='object'){
ctx[name]._$fnMap[','+type] = fn; // 将fn存入_$fnMap
return;
}
// 未重载过
var fnMap = {}; // 容器
if(typeof ctx[name] === 'function'){
// 若ctx[name]是一个函数,则存入容器
fnMap[','+ctx[name].length] = ctx[name];
}
fnMap[','+type] = fn;
ctx[name] = function overloading(){ // 代理
var args = arguments,
len = args.length,
type, i;
for(i=0, type=''; i<len; ++i){ // 计算参数类型
type += ',' + typeof args[i];
}
// 依次匹配:参数类型->参数个数
if(fnMap[type]) return fnMap[type].apply(this, args);
if(fnMap[','+len]) return fnMap[','+len].apply(this, args);
throw 'Overload: no matched function';
};
ctx[name]._$fnMap = fnMap; // 将fnMap挂载到代理上
}

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧