JS是否支持两个具有相同名称和不同参数的函数?
function f1(a, b)
{
// a and b are numbers
}
function f1(a, b, c)
{
// a is a string
//b and c are numbers
}
我可以在IE7,FF,Opera中使用那些JS函数吗?
答案 0 :(得分:34)
JavaScript不支持您在其他语言方法重载中调用的内容,但有多种解决方法(如使用arguments
对象)来检查函数有多少个参数被调用:
function f1(a, b, c) {
if (arguments.length == 2) {
// f1 called with two arguments
} else if (arguments.length == 3) {
// f1 called with three arguments
}
}
此外,您可以键入 - 检查您的参数,对于Number和String 原语可以安全地使用typeof
运算符:
function f1(a, b, c) {
if (typeof a == 'number' && typeof b == 'number') {
// a and b are numbers
} else if (typeof a == 'string' && typeof b == 'number' &&
typeof c == 'number') {
// a is a string, b and c are numbers
}
}
还有更复杂的技术,如下文中的那些,利用一些JavaScript语言功能,如闭包,函数应用程序等,来模仿方法重载:
答案 1 :(得分:7)
不,你不能在JS中使用函数重载。
但是,您可以只声明具有3个参数的版本,然后检查第三个参数=== undefined
,并在此基础上提供差异化行为。
答案 2 :(得分:3)
不,这不起作用,只会在您的页面上定义第二个功能。 Here是一个来源。
答案 3 :(得分:2)
Javascript仅使用最后定义的函数。
http://weblogs.asp.net/jgalloway/archive/2005/10/02/426345.asp X
您需要在函数内部实现自己的逻辑,以确定传入了哪些参数。
答案 4 :(得分:1)
不,你不能这样做......除非你只能保留你的最后一个定义。
答案 5 :(得分:0)
您也可以使用instanceof,例如基本多态。
首先创建一个超类(球)
// superclass
function Ball() {
this.play = function() {
alert("Ball throw");
};
}
现在对于某些子类(球的类型)
// subclass
function Basketball() {
this.play = function() {
alert("basketball throw");
};
}
// subclass
function Soccerball() {
this.play = function() {
alert("soccer ball kick/throw");
console.debug("here");
};
}
// subclass
function Baseball() {
this.play = function() {
alert("strike 3 you're out");
console.debug("here");
};
}
给他们Ball功能,也就是通过原型设置他们的超类
// set subclass functionality
Basketball.prototype = new Ball();
Soccerball.prototype = new Ball();
Baseball.prototype = new Ball();
一些多态性(创建一堆球并与它们一起玩,但是根据类型进行游戏)
var bunchOfBalls = [new Baseball(), new Soccerball(), new Basketball()];
for (var i = 0; i < bunchOfBalls.length; i++) {
bunchOfBalls[i].play();
}
现在编写一个接球的功能,但只想为特定类型的球工作(模拟函数重载,或多或少)
//overloading dependent upon type
function BasketbalOrBaseballOnlyPlay(aBall) {
if (aBall instanceof Basketball) {
//special basketball function
}
if (aBall instanceof Baseball) {
//special baseball function
}
}
如果aBall是篮球,那么aBall = new Basketball();
那么aBall instanceof Basketball
将为篮球返回true而对于棒球则为false,但对于Ball来说是真的。
所以aBall instanceof Ball
会返回true,因为篮球是一个球。