2011-01-28 6 views
11

Digamos que tiene dos funciones con las siguientes firmas:¿Cómo se detecta una función de JavaScript con una determinada firma registrada?

  1. addClass(class)
  2. addClass(class, duration)

Estos viven en una biblioteca de terceros (No es difícil adivinar lo que !!).

Si llama al addClass() con dos parámetros pero solo tiene la firma 1 registrada, no habrá ningún error y se llamará a la firma 1. El segundo parámetro es ignorado.

¿Hay alguna forma de detectar que la firma 2 con dos parámetros ha sido registrada?

+4

Usted sabe que si puede llamar a la versión de un solo argumento con dos argumentos, simplemente ignorará el segundo argumento, supongo? – lonesomeday

Respuesta

25

Puede usar la propiedad length del objeto de función para verificar la firma. Ejemplo:

function x(a) {} 
function y(a,b) {} 

alert(x.length); // shows "1" 
alert(y.length); // shows "2" 
8

No hay sobrecarga de métodos nativos en JavaScript. Usted puede crear su propia cuenta, sin embargo: http://ejohn.org/blog/javascript-method-overloading/

(Actualización 11/05/15: El enlace parece estar muerto, aquí está la Google Cache version)

Así que si lo hace

function addClass(class) { console.log('1 arg'); }; 
function addClass(class, duration) { console.log('2 args'); }; 

el segundo sobrescribe el primero. Entonces, incluso si llama "addClass (1)", la salida seguirá siendo "2 args". Igual que haciendo

someObject.addClass = function(a) {...} 
someObject.addClass = function(a, b) {...} 

Se perderá la primera "versión".

+0

+1 para el [enlace] (http://ejohn.org/blog/javascript-method-overloading/) – jwaliszko

+0

el enlace está muerto – Alex

+0

@Alex Gracias, he agregado el enlace de caché de google –

3

No es muy difícil de lograr, pero el método de Resig no es demasiado, ya que solo verifica la longitud de los argumentos, que solo se relaciona tangencialmente con las firmas de llamada reales.

El método de Johannes es en realidad el método que anula no múltiples firmas de llamada, y de todos modos fallará en el modo JS Strict, donde se prohíbe la declaración de múltiples funciones del mismo nombre.

Para aplicar correctamente que necesita para ponerlo en práctica a través de la transferencia de llamadas, envolviendo cada firma llamada en una verificación de tipos/existencia:

function myFunction(arg1, arg2, arg3){ 
    switch(true){ 
    case arg1 instanceof someObject: 
     myFunction_signature1.apply(this, arguments); 
     break; 
    case typeof arg1 === "string": 
     myFunction_signature2.apply(this, arguments); 
     break; 
    } 
} 

se pone un poco más complejo cuando algunos parametros son opcionales también.

0

Si está utilizando un nodo puede usar func.toString() y analizar el resultado para obtener la firma que se estaba utilizando.

Cuestiones relacionadas