Citation :c'est du code client, tu peux exécuter n'importe quelle fonction à la volée via la consoleCe n'est pas une raison, car si le code est passé, par exemple, par variable get, je peux faire un lien vers le site d'Argorate, avec dedans mon propre code Javascript. Et bonjour XSS, ça faisait longtemps... T'as passé de bonnes vacances?
La solution de Maks est appropriée.
Sinon:
function Toto()
{
this.test=function(i){
var t;
if(i==1) t='func1';
else t='func2';
var temp = new Toto();
temp[t]();
};
this.func1=function()
{console.log('1');}
this.func2=function()
{console.log('2');}
}
new Toto().test(1);
Rien ne t'empêche de faire un compromis entre le pattern souligné par Oxman et ton envie de ne rien faire en dur:
tu peux faire de Toto une usine à qui tu passes une chaine de caractères ou un index (comme test(1)) et qui te renvoie le nouvel objet, sans avoir un espèce de "switch" ou "if" en dur dans le code de Toto.
Bon, en revanche, avec un "new Toto()" dans "Toto", fais gaffe à ne pas faire de la boucle infinie... En d'autres mots, le "new Toto()" doit être dans une méthode de Toto, et surtout pas directement dans Toto() même (sinon, tu crash le navigateur, comme je l'ai moi même fait \o/)
Exemple:
function UsineAGaz()
{
this.produire = function(p_nom)
{
console.log('On me demande le gaz:',p_nom);
var usineTemporaire = new UsineAGaz();
var ceGazCi = usineTemporaire['Gaz'+p_nom];
if (typeof ceGazCi == 'function')
return new ceGazCi();
console.warn('Le gaz "',p_nom,'" n\'existe pas.');
return new this.GazDefaut();
}
this.GazXenon = function ()
{
this.saluer = function()
{
console.log('Je suis rare, donc précieux');
};
}
this.GazSchiste = function ()
{
this.saluer = function()
{
console.log('Je pue et je pollue !');
};
}
this.GazEau = function ()
{
this.saluer = function()
{
console.log('Y\'a de l\'eau dans le gaz.');
};
}
this.GazDefaut = this.GazEau;
}
var Usine = new UsineAGaz();
Usine.produire('Eau').saluer();
Usine.produire('pard').saluer();
Usine.produire('Schiste').saluer();
Usine.produire('Xenon').saluer();
Firebug (et f** le charset=utf-8) a écrit :On me demande le gaz: Eau
Y'a de l'eau dans le gaz.
On me demande le gaz: pard
Le gaz " pard " n'existe pas.
Y'a de l'eau dans le gaz.
On me demande le gaz: Schiste
Je pue et je pollue !
On me demande le gaz: Xenon
Je suis rare, donc précieux
Similaire à Factory, sans expliciter chaque gaz dans le code de "fabrication". MAIS impossible de changer le nom des gaz sans devoir refaire un bout de code (ex: changer GazEau en GazRien obligera à ajouter un ligne de code dans "produire()" pour traiter les anciens appels à GazEau).
Egalement, j'aurai personnellement mis les gaz ailleurs que dans l'Usine elle-même, c'est pas franchement le must (dans un "ListeGaz()" par exemple).