Sobrecarga de funciones en Javascript: mejores prácticas [cerrado]
¿Cuál es la mejor forma de fingir la sobrecarga de funciones en Javascript?
Sé que no es posible sobrecargar funciones en Javascript como en otros lenguajes. Si necesitara una función con dos usos foo(x)
y foo(x,y,z)
cuál es la mejor forma preferida:
- Usar nombres diferentes en primer lugar
- Usando argumentos opcionales como
y = y || 'default'
- Usando varios argumentos
- Comprobación de tipos de argumentos.
- ¿O como?
La mejor manera de sobrecargar funciones con parámetros es no verificar la longitud del argumento o los tipos; verificar los tipos solo hará que su código sea lento y podrá divertirse con matrices, nulos, objetos, etc.
Lo que hacen la mayoría de los desarrolladores es agregar un objeto como último argumento a sus métodos. Este objeto puede contener cualquier cosa.
function foo(a, b, opts) {
// ...
if (opts['test']) { } //if test param exists, do something..
}
foo(1, 2, {"method":"add"});
foo(3, 4, {"test":"equals", "bar":"tree"});
Entonces puedes manejarlo como quieras en tu método. [Cambiar, si no, etc.]
A menudo hago esto:
C#:
public string CatStrings(string p1) {return p1;}
public string CatStrings(string p1, int p2) {return p1+p2.ToString();}
public string CatStrings(string p1, int p2, bool p3) {return p1+p2.ToString()+p3.ToString();}
CatStrings("one"); // result = one
CatStrings("one",2); // result = one2
CatStrings("one",2,true); // result = one2true
Equivalente de JavaScript:
function CatStrings(p1, p2, p3)
{
var s = p1;
if(typeof p2 !== "undefined") {s += p2;}
if(typeof p3 !== "undefined") {s += p3;}
return s;
};
CatStrings("one"); // result = one
CatStrings("one",2); // result = one2
CatStrings("one",2,true); // result = one2true
Este ejemplo en particular es en realidad más elegante en javascript que en C#. Los parámetros que no se especifican están "indefinidos" en javascript, lo que se evalúa como falso en una declaración if. Sin embargo, la definición de la función no transmite la información de que p2 y p3 son opcionales. Si necesita mucha sobrecarga, jQuery ha decidido utilizar un objeto como parámetro, por ejemplo, jQuery.ajax(opciones). Estoy de acuerdo con ellos en que este es el enfoque de sobrecarga más poderoso y claramente documentable, pero rara vez necesito más de uno o dos parámetros opcionales rápidos.
EDITAR: prueba IF modificada según la sugerencia de Ian
No existe una sobrecarga de funciones real en JavaScript, ya que permite pasar cualquier cantidad de parámetros de cualquier tipo. Tienes que comprobar dentro de la función cuántos argumentos se han pasado y de qué tipo son.