比如定义了三个名字一样的函数,一个没有参数,一个有一个参数,一个有两个参数,然后调用时根据给予的参数个数它自己能认得调用那个吗?
2010-11-21 12:00
最佳答案
javascript函数的重载和java的重载方式不一样。 定义JavaScript函数时,函数名是函数对象的标识,参数数量只是这个函数的属性。靠定义参数数量不同的函数实现重载是不行的。 调用函数时,js通过函数名找到对应的函数对象,然后根据函数按照定义时的参数,和表达式参数列表按顺序匹配,多余的参数舍去,不够的参数按undefined处理,然后执行函数代码。所以,js重载函数需要通过函数代码判断参数值和类型实现。 通常定义函数时,把必选参数放在参数列表最前面,可选参数放在参数放在参数列表必须参数后面,方便函数重载。

只靠参数长度来实现function重载是可以实现的,别忘了arguments这个对象,定义一个function像这样: function myFunc(){},一个形参都不写,调用的时候,myFunc('a');myFunc('a','b');myFunc('a','b','c');然後可根据arguments.length来判断

回复 Bareev007: hahah

谢谢楼主的回答(=^ ^=)

你这答案太有用了,大赞呐~

赞同楼主,是正解
其他回答
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<script type=
"text/javascript"
>
//js是不支持重载的,通过但是arguments以及prototype可以实现重载和继承的效果:
//1,通过arguments对象,去判断函数的参数个数:
function
doAdd(){
if
(arguments.length==1){
alert(arguments[0]+10);
}
else
if
(arguments.length==2){
alert(arguments[0]+ arguments[1]);
}
}
doAdd(10);
//outputs 20
doAdd(20,30);
//outputs 50
/*备注:开发人员定义的函数都可以接受任意个数的参数(根据NetScript 文档,最多能接受25个) ,而不会引发错误,任何遗漏的参数都会用undefined 代替,多余的参数被将忽略。*/
//2,通过prototype对象实现继承,添加新的属性和方法
function
persona(){
this
.a =
'A'
;
this
.sayA =
function
(){
alert(
'My name is a'
)
}
}
function
personb(){
this
.b =
'B'
;
this
.sayB =
function
(){
alert(
'My name is b'
)
}
}
var
a =
new
persona();
personb.prototype = a;
var
b =
new
personb();
//此时b函数拥有了a的属性和方法
alert(b.a);
//outputs :A
b.sayA();
//outputs :my name is a
alert(b.b);
//outputs :B
b.sayB();
//outputs :my name is a
</script>
|
baidan1989
2016-01-29 16:02
评论
2
0
比如定义了三个名字一样的函数,一个没有参数,一个有一个参数,一个有两个参数,然后调用时根据给予的参数个数它自己能认得调用那个吗?
2010-11-21 12:00
最佳答案
javascript函数的重载和java的重载方式不一样。 定义JavaScript函数时,函数名是函数对象的标识,参数数量只是这个函数的属性。靠定义参数数量不同的函数实现重载是不行的。 调用函数时,js通过函数名找到对应的函数对象,然后根据函数按照定义时的参数,和表达式参数列表按顺序匹配,多余的参数舍去,不够的参数按undefined处理,然后执行函数代码。所以,js重载函数需要通过函数代码判断参数值和类型实现。 通常定义函数时,把必选参数放在参数列表最前面,可选参数放在参数放在参数列表必须参数后面,方便函数重载。
只靠参数长度来实现function重载是可以实现的,别忘了arguments这个对象,定义一个function像这样: function myFunc(){},一个形参都不写,调用的时候,myFunc('a');myFunc('a','b');myFunc('a','b','c');然後可根据arguments.length来判断
回复 Bareev007: hahah
谢谢楼主的回答(=^ ^=)
你这答案太有用了,大赞呐~
赞同楼主,是正解
其他回答
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<script type=
"text/javascript"
>
//js是不支持重载的,通过但是arguments以及prototype可以实现重载和继承的效果:
//1,通过arguments对象,去判断函数的参数个数:
function
doAdd(){
if
(arguments.length==1){
alert(arguments[0]+10);
}
else
if
(arguments.length==2){
alert(arguments[0]+ arguments[1]);
}
}
doAdd(10);
//outputs 20
doAdd(20,30);
//outputs 50
/*备注:开发人员定义的函数都可以接受任意个数的参数(根据NetScript 文档,最多能接受25个) ,而不会引发错误,任何遗漏的参数都会用undefined 代替,多余的参数被将忽略。*/
//2,通过prototype对象实现继承,添加新的属性和方法
function
persona(){
this
.a =
'A'
;
this
.sayA =
function
(){
alert(
'My name is a'
)
}
}
function
personb(){
this
.b =
'B'
;
this
.sayB =
function
(){
alert(
'My name is b'
)
}
}
var
a =
new
persona();
personb.prototype = a;
var
b =
new
personb();
//此时b函数拥有了a的属性和方法
alert(b.a);
//outputs :A
b.sayA();
//outputs :my name is a
alert(b.b);
//outputs :B
b.sayB();
//outputs :my name is a
</script>
|
baidan1989
2016-01-29 16:02
评论
2
0