2009-10-23 15 views
6

Estoy bastante familiarizado con jQuery. Intento escribir métodos comunes para mi propio propósito. Aquí hay un ejemplo a continuación:¿Puedo usar jQuery.extend para simular la sobrecarga de métodos?

$.extend({ 
    add : function(a, b) 
      { 
      return a + b; 
      }, 

    add : function(a, b, c) 
      { 
      return a + b + c; 
      } 
    }); 

¿Es posible la situación anterior? ¿Puedo usar el mismo nombre de extensión y pasar diferentes parámetros, como la sobrecarga de métodos?

+1

Creo que sobrescribirá la primera propiedad 'agregar' con la 2da. – alex

+0

. Supongo que quiere decir "sobrecarga". Pero como señala alex, la segunda función * * invalidará ** la primera ... – Shog9

Respuesta

15

Usted está tratando de hacer algún tipo de lo que se llama en algunos idiomas método de sobrecarga.

JavaScript no lo admite de esa manera.

JavaScript es muy versátil y le permite lograr este tipo de características de diferentes maneras.

Para su ejemplo particular, su función add, le recomendaría realizar una función que acepte un número arbitrario de parámetros, utilizando el objeto arguments.

jQuery.extend(jQuery, { 
    add: function (/*arg1, arg2, ..., argN*/) { 
    var result = 0; 

    $.each(arguments, function() { 
     result += this; 
    }); 

    return result; 
    } 
}); 

entonces puede pasar cualquier número de argumentos:

alert(jQuery.add(1,2,3,4)); // shows 10 

Para el método más complejo sobrecarga puede detectar el número de argumentos pasados ​​y sus tipos, por ejemplo:

function test() { 
    if (arguments.length == 2) { // if two arguments passed 
    if (typeof arguments[0] == 'string' && typeof arguments[1] == 'number') { 
     // the first argument is a string and the second a number 
    } 
    } 
    //... 
} 

Consulte el siguiente artículo, que contiene una técnica muy interesante que aprovecha algunas características del lenguaje JavaScript como cierres, aplicaciones de función, etc., para imitar sobrecarga de métodos:

+1

Es tarde y probablemente estoy leyendo tu código incorrectamente, pero no jQuery.add (1,2,3,4) 'devolver' 10'? – Jared

+0

Su función usa un analizador de patrones mágicos, y determinó que el próximo número en secuencia sea 5;) – alex

+0

@Jared: ¡Tienes razón, solo fue un error tipográfico! – CMS

3

Creo que sobrescribirá la primera propiedad 'agregar' con la segunda propiedad 'agregar' que haya definido. Esto es útil al desarrollar complementos, y desea proporcionar una lista de valores predeterminados razonables para un objeto de configuración.

0

JavaScript no lanza errores si se pasa un menor número de parámetros a la función de lo que se define a aceptar.

Puede usar una configuración de argumentos variables en su función usando "argumentos", o podría simplemente definir su función como lo hizo en la 2da declaración (con 3 parámetros) y simplemente verificar si el 3er parámetro no está definido. Si no se proporciona un argumento, se establece como indefinido y puede simplemente verificarlo (no es lo mismo que nulo), que puede ser más simple que tener que usar el objeto arguments.

Cuestiones relacionadas