javaScript函数不支持重载。有时我们想像java、C等语言 一样定义 重载的方法,那么 我们就可以用其他的方式去定义 重载的函数。 当然,实现的方式 有好多种,每个人 可能不同。下面 我贴出我的实现及使用方法 和 大家交流。
js 源码:
/** * 函数参数重载方法 overload,对函数参数进行模式匹配。默认的dispatcher支持*和...以及?,"*"表示一个任意类型的参数,"..."表示多个任 *意类型的参数,"?"一般用在",?..."表示0个或任意多个参数 * @method overload * @static * @param {funcmaps} 根据匹配接受调用的函数列表 * @return {function} 已重载化的函数 */ var Overload = { 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; }, getObjectClassName: function(obj) { if (obj && obj.constructor && obj.constructor.toString()) { var arr = obj.constructor.toString().match(/function\s*(\w+)/); if (arr && arr.length == 2) { return arr[1]; } } return undefined; }, overload: function(dispatcher, func_maps) { if (!(dispatcher instanceof Function)) { func_maps = dispatcher; dispatcher = function(args) { var ret = []; return Overload.map(args, function(o) { return Overload.getObjectClassName(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 test = Overload.overload({ "String,String":function(a,b){ return a + b; }, "Number,Number":function(a,b){ return a + b; }, "String,Date":function(a,b){ return a + b.toLocaleString(); } }); console.log(test("hello ","world!")) console.log(test(1,2)) console.log(test("now time is:",new Date()))
result:
hello world!
3
now time is:2016-07-14 21:07:29
当然 ,还支持 自定义类型:
var test = Overload.overload({ "String,String":function(a,b){ return a + b; }, "Number,Number":function(a,b){ return a + b; }, "String,Date":function(a,b){ return a + b.toLocaleString(); }, "Student":function(s){ return "name is "+s.name+" and age is "+s.age; } }); function Student(name,age){ this.name = name this.age = age } console.log(test(new Student("张三",23)))
result:
name is 张三 and age is 23
当然 还可以 使用 通配符,这里 就 不举例了。
注意:
当调用重载函数 参数 列表的类型和个数 都相同的 两个函数,会调用后者;
当 通配符和非通配符函数 同时满足条件时,按定义顺序 调用前者。
时间: 2024-11-08 18:16:02