其它面向对象语言如Java的一个常见特性是:能够根据传入的不同数量量或类型的参数,通过“重载”函数来发挥不同的功用。但是这个特性在Javascript中并没有被直接支持,可是有很多办法实现这一功能。
不管何种面向对象语,函数重载必须依赖两件事情,分别是:
1)判断传入参数数量的能力
2)判断传入参数类型的能力
第1件事情:Javascript判断传入参数数量
Javascript的每个函数都带有一个仅在这个函数范围内作用的变量——arguments,它是一个包含所有传给函数的参数的伪数组。为什么是伪数组?—— 你不能修改它,也不能用push来添加新元素等。但是你可以访问其中的元素,并且同时具有.length属性。有了length属性,我们就可以很方便的知道函数传入了几个参数。
function send( message, who ) {
if( arguments.length >= 2 ) {
console.log("你对" + who + "说:" + message);
}
else {
console.log("你对大家说:" + message);
}
}
第2件事情:Javascript判断传入的参数类型
如果我们在函数中并没有提供参数,那么message和who的值一定为'undefined'。我们可以使用typeof message = 'undefined'来判断是否传入了参数。
function send( message ) {
if( typeof message === 'undefined' ) {
console.log("ERROR:错误的信息内容");
}
else {
console.log("你说:" + message);
}
}
javascript中的类型检查我常常用两种方法来判断:
方法1:typeof 变量 == '类型名'。如下:
var x = 123;
typeof x == 'number' //true
x = '123';
typeof x == 'string' //true
但是,对于Array和Object对象,typeof之后的值是一样的,都为Object。即 typeof [] == type new Object(),如此当我们想要判断一个对象是否为数组或我们自定义的对象时,这种方法就显得有点不够好了。
方法2:利有构造函数来判断变量类型( 变量.constructor == 构造函数)
var num = 1, str = 'abcd', arr = [], obj = {}, tf = true, f = function(){};
用typeof对它们分别进行求值后,得到的结果分别是:number、string、 object、 object、 boolean、 function
如果分别调用它们的构造函 数,得到的结构分别是:Number、String、Array、Object、Boolean、Function
了解了上面两件事情(变量个数、变量类型)之后,我们就可以创造出属于自己的Javascript重载函数了。
本文只起抛砖引入的作用,具体如何利用,全靠个人发挥。