精通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]);
}
函数重载(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]);
}
相关文章推荐
- 面向对象的 Javascript 函数重载和类型检查
- 面向对象的 Javascript 函数重载和类型检查
- Javascript学习笔记之函数重载和类型检查
- 面向对象的 Javascript 函数重载和类型检查
- 语言特性-函数重载与类型检查
- JS函数重载和类型检查
- javascript检查数值类型函数
- javascript检查数值类型函数
- JavaScript命名空间、函数参数类型重载的实现
- 精通Javascript 之 函数重载
- 语言特性-函数重载与类型检查
- python 函数定义和内置函数isinstance以及数据类型检查type的使用
- Flow: JavaScript静态类型检查工具
- JavaScript基础 null:object 类型,转成bool类型是 :false Boolean()系统函数
- JavaScript基础语法:数据类型、变量、控制结构、函数、表达式
- 实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制
- JavaScript基于自定义函数判断变量类型的实现方法
- Javascript实现函数重载
- javascript 实现函数/方法重载效果
- javascript的函数没有java的重载功能