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

当然 还可以 使用 通配符,这里 就 不举例了。

注意:

当调用重载函数 参数 列表的类型和个数 都相同的 两个函数,会调用后者;

当 通配符和非通配符函数 同时满足条件时,按定义顺序 调用前者。

时间: 2024-11-08 18:16:02

javaScript 函数重载的相关文章

javascript 函数重载 overloading

函数重载 https://en.wikipedia.org/wiki/Function_overloading In some programming languages, function overloading or method overloading is the ability to create multiple methods of the same name with different implementations. Calls to an overloaded functi

浅谈JavaScript函数重载

上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都很难,根本回答不上来.不过那天晚上,还是很惊喜的接到了HR面电话.现在HR面试的结果还没有出来,听说要等到下周二才出,所以再好好等几天哈. 前面说了这多的废话,现在是时候和伙伴们分享一下面试干货哈.因为二面问到的内容还挺多的,所以这里就不全部列举出来了.这里只讨论一下函数的重载. 下面是面试时的对话,“面”指面试官,“我”就是我~ 面:你能说说JS怎么实现函数的重载吗?

javascript arguments与javascript函数重载

1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是’object’.虽然我们可以用调用数据的方法来调用arguments.比如length,还有index方法.但是数 组的push和pop对象是不适用的. 2.函数定义时的参数个数和函数调用时的参数个数没有任何关系. 在函数中可以用f.arguments[0]和f.arguments[1]得到调用时传入的第一和第二个参数,arguments不能够创建

JavaScript的函数重载

java语言中函数的重载和重写可谓是很重要的概念,所以在写js的时候时不时的会想到这种用法,重写先不说,这里只说重载.. <script language="JavaScript"> function test(one) { alert("上面"); } function test(one,two) { alert("下面"); } </srcipt> 如上代码,调用的时候会发现无论你传几个参数,都只会弹出"下面

Javascript函数(定义、传值、重载)

Javascript 函数的定义的方式有不止一种. 第一种方式: function fn1(){ alert(typeof fn1); alert(“fn1”); } 在调用的时候直接就可以fu1(); 函数运行的结果就是两个alert:function   fn1. 有必要说明的是,function是一个对象(在后面对对象的说明中也会具体细说),新定义的函数就是function这个类的一个实例.但是function和object的区别就在于在定义两个函数实例fn1和fn2的过程中,实现了对fu

JavaScript 没有函数重载&amp;Arguments对象

对于学过Java的人来说,函数重载并不是一个陌生的概念,但是javaScript中有函数重载么...接下来我们就进行测试 <script type="text/javascript"> //JavaScript不存在函数重载现象 var add=function(a,b){ return a+b; } var add=function(a,b,c){ return a+b+c; } <span style="white-space:pre">

javascript 函数1_函数的重载

<!DOCTYPE html> <html> <head> <title>javascript函数的重载</title> <meta charset="UTF-8"> <script type="text/javascript"> /** * 此时sum所指向的空间已经从有两个参数的函数变化到只有num1的函数中 * 在调用的时候就只会调用只有num1的函数,特别指出:函数的参数和调

JavaScript 没有函数重载&amp;amp;Arguments对象

对于学过Java的人来说.函数重载并非一个陌生的概念,可是javaScript中有函数重载么...接下来我们就进行測试 <script type="text/javascript"> //JavaScript不存在函数重载现象 var add=function(a,b){ return a+b; } var add=function(a,b,c){ return a+b+c; } <span style="white-space:pre">

JavaScript函数的arguments对象、重载问题

一.arguments对象概述: 1.ECMAScript 函数不介意传递进来多少参数,也不会因为参数不统一而错误. 2.函数体内可以通过 arguments 对象来接收传递进来的参数,并且保存函数参数 function box() { return arguments[0]+' | '+arguments[1]+' | '+arguments[5]; //得到每次参数的值,最后结果是1 | 2 | 6 } alert(box(1,2,3,4,5,6)); //传递参数 二.arguments