John Resig, creatore e team leader del framework Javascript jQuery, ha messo a disposizione sul suo blog una funzione estremamente compatta che permette di effettuare l'overloading di metodi all'interno dei costruttori Javascript chiamata "addMethod". La tecnica del "method overloading" consente di differenziare il compito di un metodo a seconda del numero di parametri che gli vengono passati.
Ad esempio, supponiamo di avere un costruttore chiamato Fruits che contiene un array di stringhe e aggiungiamogli un metodo chiamato "find" con la funzione di Resig:
function Fruits(name, items){ this.name = name; this.items = items || ['apple', 'pear', 'orange']; } // metodo find con zero parametri addMethod(Fruits.prototype, "find", function(){ alert('All items: ' + this.items); }); // metodo find con un parametro addMethod(Fruits.prototype, "find", function(name){ var found = false; for(var i = 0; i<this.items.length; i++) if(this.items[i] == name) found = true; if(found) alert('One item found with name :"' + name + '"'); else alert('No item found with name :"' + name + '"'); });
Se richiamiamo il metodo find
su di un'istanza di Fruits con zero parametri, verranno visualizzati tutti i frutti, ovvero 'apple', 'pear', 'orange'.
Se invece richiamiamo find
con un parametro, il corpo della funzione cambia completamente come se fosse un'altra, visualizzando un messaggio positivo se il frutto passato è contenuto in Fruits oppure un messaggio negativo:
var user = new Fruits('My Fruits'); // visualizza tutti i frutti user.find(); // se 'apple' è presente visualizza un messaggio opportuno user.find('apple');
La tecnica che Resig ci fornisce è molto utile in applicazioni orientate agli oggetti e piuttosto avanzata, facendo uso di una proprietà particolare e non molto nota come Function.length
e di altre proprietà specifiche del costruttore Function.