87,910
社区成员
发帖
与我相关
我的任务
分享
/**
* 重载工具函数
* @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挂载到代理上
}