2009-10-23 11 views
6

Sono abbastanza familiare con jQuery. Sto cercando di scrivere metodi comuni per il mio scopo. Ecco un esempio qui sotto:Posso usare jQuery.extend per simulare l'overloading del metodo?

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

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

È possibile lo scenario sopra riportato? Posso usare lo stesso nome di estensione e passare diversi parametri, come il sovraccarico del metodo?

+1

Penso che sarà sufficiente sovrascrivere la prima proprietà 'aggiungi' con il 2 ° – alex

+0

presumo che intendessi "sovraccarico". Ma come nota alex, la seconda funzione * sostituirà ** ** la prima ... – Shog9

risposta

15

Si sta tentando di eseguire un tipo di ciò che viene chiamato in alcune lingue overloading del metodo.

JavaScript non supporta in questo modo.

JavaScript è molto versatile e consente di ottenere questo tipo di funzionalità in diversi modi.

Per il tuo esempio particolare, la tua funzione add, ti consiglio di creare una funzione che accetti un numero arbitrario di parametri, utilizzando l'oggetto arguments.

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

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

    return result; 
    } 
}); 

Quindi è possibile passare qualsiasi numero di argomenti:

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

Per il metodo più complesso sovraccarico è possibile rilevare il numero di argomenti passati e dei suoi tipi, per esempio:

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

Controlla il seguente articolo, contiene una tecnica molto interessante che sfrutta alcune caratteristiche del linguaggio JavaScript come chiusure, applicazioni di funzioni, ecc, per imitare lo metodo sovraccarico:

+1

È tardi e probabilmente sto leggendo il tuo codice sbagliato ma non sarebbe 'jQuery.add (1,2,3,4) 'return' 10'? – Jared

+0

La sua funzione utilizza un parser di pattern magico e determina il numero successivo in sequenza a 5;) – alex

+0

@Jared: hai perfettamente ragione, è stato solo un refuso! – CMS

3

Penso che sovrascriverà solo la prima proprietà "add" con la seconda proprietà "add" che hai definito. Questo è utile quando si sviluppano i plugin e si desidera fornire un elenco di valori predefiniti sensibili per un oggetto di configurazione.

0

JavaScript non genera errori se si passa un numero di argomenti a una funzione di quello che è definito in modo da accettare.

È possibile utilizzare un argomento variabile impostato nella funzione utilizzando "argomenti", oppure è possibile definire la funzione come si era nella seconda istruzione (con 3 parametri) e verificare semplicemente se il terzo parametro non è definito. Se non viene fornito un argomento, viene impostato come non definito e si può semplicemente verificare (non è lo stesso di null) che potrebbe essere più semplice del dover utilizzare l'oggetto arguments.

Problemi correlati