2010-02-02 27 views
20

¿Admite JS dos funciones con el mismo nombre y diferentes parámetros?Ayuda con JS y parámetros de funciones

function f1(a, b) 
{ 
// a and b are numbers 
} 

function f1(a, b, c) 
{ 
// a is a string 
//b and c are numbers 
} 

¿Puedo usar la función JS para IE7, FF, Opera sin ningún problema?

Respuesta

32

JavaScript no es compatible con lo que llamarían en otros idiomas sobrecarga de métodos, pero hay varias soluciones, como la utilización del objeto arguments, comprobar con el número de argumentos de una función que se ha invocado:

function f1(a, b, c) { 
    if (arguments.length == 2) { 
    // f1 called with two arguments 
    } else if (arguments.length == 3) { 
    // f1 called with three arguments 
    } 
} 

Además puede escribir a revisar sus argumentos, por Number y String primitivas es segura para utilizar la typeof operador:

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 
    } 
} 

y hay técnicas mucho más sofisticadas como la que en el siguiente artículo, que se aprovecha de algún lenguaje Javascript características como cierres, aplicación de función, etc, para imitar la sobrecarga de métodos :

7

No, no puede usar la función de sobrecarga en JS.

Pero, puede declarar solo la versión con 3 parámetros, y luego verificar si el tercer argumento === undefined, y proporcionar un comportamiento diferenciado sobre esa base.

+0

En el caso de que la persona que llama pasa un tercio argumento, pero su valor es indefinido * * esta prueba sería un fracaso. Probablemente sea mejor si la función prueba ** arguments.length ** en su lugar. – NVRAM

+0

Si la persona que llama utiliza 'undefined' como tercer argumento, tomaría eso como señal de que les gustaría que la función sea tratada como si solo se hubieran transmitido dos. Realmente no veo ningún otro propósito legítimo para aprobar en 'undefined'. –

3

No, eso no funcionará, solo la segunda función se definirá en su página. Here es una fuente.

1

No, no puedes hacer eso ... a menos que esté bien que solo tengas tu última definición.

0

También puede usar instanceof, ejemplo con polimorfismo básico.

En primer lugar crear una superclase (bola)

// superclass 
function Ball() { 
    this.play = function() { 
     alert("Ball throw"); 
    }; 
} 

y ahora para algunas subclases (tipos de pelotas)

// 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"); 
    }; 
} 

Dales funcionalidad de bola, establece también conocido como su superclase mediante prototipo

// set subclass functionality 
Basketball.prototype = new Ball(); 
Soccerball.prototype = new Ball(); 
Baseball.prototype = new Ball(); 

Algún polimorfismo (cree un montón de bolas y juegue con todas, pero juegue a base de tipo n)

var bunchOfBalls = [new Baseball(), new Soccerball(), new Basketball()]; 
for (var i = 0; i < bunchOfBalls.length; i++) { 
    bunchOfBalls[i].play(); 
} 

Ahora escribe una función que toma un balón, pero sólo quieren trabajar para el tipo específico de pelotas (gráfico sobrecarga de funciones, más o menos)

//overloading dependent upon type 
function BasketbalOrBaseballOnlyPlay(aBall) { 
    if (aBall instanceof Basketball) { 
     //special basketball function 
    } 
    if (aBall instanceof Baseball) { 
     //special baseball function 
    } 

} 

Si aBall es un baloncesto entonces aBall = new Basketball(); luego aBall instanceof Basketball volvería verdadero para Baloncesto y falso para béisbol, pero es cierto para Ball.

Entonces aBall instanceof Ball volvería cierto porque un Baloncesto es una Pelota.

See code live at http://jsfiddle.net/kLCPB/

Cuestiones relacionadas