vendredi 15 mai 2009
En JavaScript, il n'y a pas réellement de moyen précis de faire une surcharge de méthode, c'est à dire d'appeler une fonction qui accepte un nombre arbitraire de paramètres.
En fait, si on définit deux fonctions qui portent le même nom mais qui possèdent une nombre différent de paramètres, seule la dernière déclarée sera appelée.
// ne sera jamais exécutéeSinon, une alternative est de définir une seule fonction, de ne pas spécifier de liste d'arguments dans sa signature et de boucler sur la liste des arguments reçus. Cependant, ça peut être difficile à gérer car les paramètres ne sont pas nommés, peuvent être dans certains cas optionnels et doivent suivre l'ordre reçu.
function test(p1){
console.log('Version à 1 paramètre');
}
// celle-ci fonctionnera et affichera un message dans Firebug
function test(p1, p2){
console.log('Version à 2 paramètres');
}
test('a');
test('a', 'b');
function test() {Ma solution préférée est d'utiliser un framework JavaScript comme jQuery ou Prototype et de passer une objet JSON en paramètre. Ainsi, la signature de la fonction ne change pas (toujours le même nombre d'arguments, dont un qui en contient plusieurs sous la forme JSON), les paramètres sont nommés du fait que la valeur est une propriété de l'objet et je peux les passer dans l'ordre que je veux.
for(var i=0; i<arguments.length; i++) {
console.log("Paramètre " + i + ": " + arguments[i]);
}
}
Pour donner un exemple concret, imaginez une fonction qui reçoit différentes propriétés reliées à une pièce musicale numérique. À l'intérieur de la fonction, je liste les propriétés attendues et je les initialise avec des valeurs par défaut qui seront écrasées seulement si je passe une nouvelle valeur en paramètre. L'exemple ci-dessous se base sur jQuery, mais peut facilement être modifié pour l'utiliser avec Prototype.
function myFunction(params) {Finalement, il ne reste plus que l'appel à la fonction. Pour faciliter la lecture, je crée d'abord la liste d'arguments et je passe l'objet à ma fonction.
// Pour Prototype, remplacer $.extend par Object.extend
var properties = $.extend(
{
'Artist' : '',
'Album' : '',
'Track' : '',
'Title' : '',
'Year' : '',
'Genre' : 'Unknown',
'Format' : 'Mp3',
'Kbps' : '320',
'Disk' : ''
}, params || {} );
// afficher toutes les propriétés et leurs valeurs
for(var p in properties){
console.log(p + ' = ' + properties[p]);
}
// validations
if (properties.Artist == ''){
console.log('Oups, il faut au moins mettre le nom de l\'artiste');
}
}
var args =J'espère que ça vous sera utile. Je vous souhaite un bon weekend!
{
'Artist' : 'Jean Leloup',
'Album' : 'Mille excuses Milady',
'Track' : '8',
'Title' : 'Recommencer',
'Year' : '2009',
'Genre' : 'Francophone',
'Kbps' : '320',
// ajouter dynamiquement une propriété
// qui n'existe pas dans ceux attendus
'Rating' : '5'
};
myFunction(args);