标签:js javascript js重载 javascript重载
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
当然 还可以 使用 通配符,这里 就 不举例了。
注意:
当调用重载函数 参数 列表的类型和个数 都相同的 两个函数,会调用后者;
当 通配符和非通配符函数 同时满足条件时,按定义顺序 调用前者。
本文出自 “泪梦红尘” 博客,请务必保留此出处http://wangywei.blog.51cto.com/7093660/1826527
标签:js javascript js重载 javascript重载
原文地址:http://wangywei.blog.51cto.com/7093660/1826527