您的位置:首页 > Web前端 > JavaScript

精通JavaScript —— 函数重载和类型检查

2009-11-18 17:18 435 查看
其它面向对象的语言如JAVA的一个常见特性是,根据传入的不同数量或类型的,通过重载(overload) 来发挥不同的功用。尽管这个特性在JavaScript中并没有直接支持,也有很多办法能够实现。
函数重载(function overloading)必须依赖两件事情:判断传入参数的数量的能力和判断传入参数类型的能力。
JavaScript的每个函数都带有一个仅在这个函数范围内作用的变量(contextual variable)
称为参数(argument),它是一个包含所有传给参数的伪数组(pesudo-array),所以它并非真正意义上的数组(也就是说你不能修改它,也不能用push来刷新它),但是可以访问其中的元素,它也具有length属性。
例子:JavaScript中函数重载的两个例子
<script>
function sendMessage(msg,obj){
// 如果消息和对象的参数都被提供
if(arguments.length == 2){
// 给对象发送消息
obj.handleMsg(msg);
}else
alert(msg); // 否则仅显示默认的错误信息
}

sendMessage("hello world!"); // 仅传递一个参数,显示错误的提示信息
// 输出结果为:警示框 hello world
/*又或者我们可以将一个我们自己写好的对象传入,负责用另一套办法显示信息*/
sendMessage("how are you?" , {
handleMsg: function(msg) {
alert("This is a custom message:" + msg);
}
});
// 输出结果为:警示框 This is a custom message how are you?
/*
var obj = new Object();//创建一个新对象并将其存放在obj里
obj.val = 5; //将该对象的一些属性设置成不同的值
obj.click = function(){
alert( "hello" );
};
//下面是等效的代码,使用了{...}式缩写,
//和定义对象属性的"名称-值"对
var obj = {
//用名称-值对设置对象属性
val: 5,
click: function(){
alert( "hello" );
}
};
*/

// 一个接受任意数量参数,并转化为数组的函数
function makeArray() {
var arr = [] ; // 临时使用的数组

for(var i=0; i<arguments.length; i++){
arr.push(arguments[i]);
}

return arr ;
}

</script>

如果没有提供参数,那么它的类型为undefined.
function displayerror(msg){
if(typeof msg == 'undefined') // 如果没有提供参数
msg = "defined msg!! ";
alert(msg);
}

displayerror();
displayerror("custom msg!!");

Typeof 语句与类型检查
使用Typeof 来判断对象类型的例子
// 检查我们的数字是否实际上是字符串
if (typeof num == "string")
num = parseInt(num) ; // 如果是则根据这个字符串解析出整数来

// 检查我们的数组是否实际上是字符串
if (typeof array== "string")
num = arr.split(",") ; // 如果是则根据逗号解析出数组来
第二种检查数据类型的方法,需要引用所有JavaScript对象都带有的一个属性,称为构造函数(constuctor)。这一属性引用的是原本用来构造该对象的那个函数。
if (num.constuctor == String)
num = parseInt( num ) ;
if(str.constuctor == Array)
str = str.join(',') ;

下面展示了用两种方法对不同类型对象进行类型检查的结果:
变量 typeof constuctor
{an: "object"] object Object
{"an", "array" } object Array
function() {} function Function
"a string" string String
55 number Number
True boolean Boolean
new User() object User

// 用一个变量类型列表严格检查一个参数列表
function strict(types , args){
// 保证类型的数量和参数的数量相匹配
if(types.length != agrs.length){
// 如果不匹配则抛出一个异常
throw "invalid number of arguments. Expected " + types.length +
" , received " + args.length + " instead. " ;
}
// 遍历所有参数检查它们的类型
for(var i=0; i<args.length; i++){
if(args[i].constuctor != types[i]){
throw "invalid arguments type. Expected " + types[i].name +
" , received " + args[i].constuctor.name + " instead. " ;
}
}
}

function userList(prefix , num , users) {
// 保证 prefix 是字符串, num 是数字, user是数组
strict([String , Number, Array] , arguments);

for(var i=0; i<num; i++)
print(prefix + " : " + users[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: