您的位置:首页 > Web前端 > JavaScript

JavaScript 函数重载

2015-07-17 23:58 651 查看
// 方法一:根据arguments的length属性来判断参数个数

function accMul(v1, v2, v3) {
var len = arguments.length;
if(len == 2) {
callFunc1(v1, v2);
} else if (len == 3) {
callFunc2(v1, v2, v3);
}

}

// 方法二:

var map = function (arr, callback, pThis) {
var len = arr.length;
var rlt = new Array(len);
for (var i = 0; i < len; i++) {
if (i in arr) {
rlt[i] = callback.call(pThis, arr[i], i, arr); 
}
}
return rlt;

}

/**

 * 函数参数重载方法 overload,对函数参数进行模式匹配。默认的dispatcher支持*和...以及?,"*"表示一个任意类型的参数,"..."表示多个任意类型的参数,"?"一般用在",?..."表示0个或任意多个参数

 * @method overload

 * @static

 * @optional {dispatcher} 用来匹配参数负责派发的函数

 * @param {func_maps} 根据匹配接受调用的函数列表

 * @return {function} 已重载化的函数

 */

var FunctionH = {
overload: function (dispatcher, func_maps) {
if (!(dispatcher instanceof Function)) {
func_maps = dispatcher;
dispatcher = function (args) {
var ret = [];
return map(args, function (o) { return typeof o}).join();
}


return function () {
var key = dispatcher([].slice.apply(arguments));
for (var i in func_maps) {
var pattern  = new RegExp("^" + i.replace("*", "[^,]*").replace("...", ".*") + "$");
if (pattern.test(key)) {
return func_maps[i].apply(this, arguments);

}
}
}

};

 

// 具体实现函数, 根据具体需求,自定义

var Calculate = FunctionH.overload({
'number,number': function () {
return arguments[0] + arguments[1];
},
'number,number,number': function () {
return arguments[0] * arguments[1] * arguments[2];
},
'string,string': function () {
return Number(arguments[0]) + Number(arguments[1]);
},

});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息