码迷,mamicode.com
首页 > 编程语言 > 详细

javaScript 函数重载

时间:2016-07-14 22:10:44      阅读:182      评论:0      收藏:0      [点我收藏+]

标签: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

javaScript 函数重载

标签:js   javascript   js重载   javascript重载   

原文地址:http://wangywei.blog.51cto.com/7093660/1826527

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!