overloadSetter
overloadSetter
, insieme con overloadGetter
, sono due metodi funzione decoratore. La funzione overloadSetter
viene utilizzata per trasformare le funzioni che hanno la firma fn(key, value)
in funzioni che potrebbero accettare argomenti oggetto, ad esempio: fn({key: value})
.
Per fare ciò, overloadSetter
deve includere la funzione originale. Questa funzione wrapper ha la firma fn(a, b)
che è una scorciatoia per fn(key, value)
. Questa diventa effettivamente la nuova versione sovraccaricata della funzione originale.
Per prima cosa questa funzione di overload è controllare se l'argomento passato key
(a
) è di tipo stringa o no. Se non è una stringa, la funzione presuppone che stiamo passando un oggetto. Quindi itera su ogni coppia chiave-valore nell'oggetto e applica la funzione originale ad esso. Se si tratta di una stringa, d'altra parte, si applica semplicemente la funzione ai valori degli argomenti a
e b
.
Esempio
Per illustrare, diciamo abbiamo la seguente funzione:
var fnOrig = function(key, value){
console.log(key + ': ' + value);
};
var fnOver = fnOrig.overloadSetter();
fnOver('fruit', 'banana');
fnOver({'fruit': 'banana', 'vegetable': 'carrot'});
Nella prima chiamata, la funzione fnOver
viene richiamato con due argomenti, una chiave e un valore. Quando la funzione controlla il tipo del valore dell'argomento a
, vedrà che si tratta di una stringa. Pertanto, invocherà semplicemente la funzione originale fnOrig
: fnOrig.call(this, 'fruit', 'banana')
. La nostra uscita della console è 'fruit: banana'
.
Per la seconda chiamata, la funzione fnOver
viene richiamato con un argomento oggetto. Poiché abbiamo passato un oggetto anziché una stringa, fnOver
eseguirà l'iterazione attraverso i membri di questo oggetto e richiamerà la funzione fnOrig
per ognuno di essi. Pertanto, fnOrig
verrà invocato due volte in questo caso: fnOrig.call(this, 'fruit', 'banana')
e fnOrig.call(this, 'vegetable', 'carrot')
. L'output della nostra console è 'fruit: banana'
e 'vegetable: carrot'
.
Extra
All'interno della funzione wrapper, vedrai che ci sia un controllo per il valore di usePlural
. Questo è un argomento per il metodo overloadSetter
stesso. Se si imposta questo valore su true
, la nuova funzione tratterà tutti gli argomenti come oggetto. Ciò significa che anche se si passa un argomento chiave di stringa, verrà comunque elaborato come oggetto.
L'altra cosa, il codice enumerables
che prelude alla dichiarazione di metodo effettivo, è lì perché risolve un problema con alcuni browser in cui i nativi Object
metodi non sono elencati in for/in
loop anche se l'oggetto in sé implementa la propria versione di esso .
anche se questo è un po 'improbabile_ per cambiare, devo sottolineare che questo è un metodo privato/interno e il codice di scrittura che dipende dall'API potrebbe non superare la prova del tempo (funziona al momento 1.3) –
non documentato, quindi niente promesse. utilizzare a proprio rischio :) – seanmonstar
Grazie per l'ottima risposta. @Dimitar, seanmonstar: Va bene, non ho intenzione di usarlo, volevo solo capire come funzionava la funzione e cosa ha fatto. –