JeuWeb - Crée ton jeu par navigateur
[JS] Invoquer dynamiquement une methode sur une class - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [JS] Invoquer dynamiquement une methode sur une class (/showthread.php?tid=7112)

Pages : 1 2 3 4


[JS] Invoquer dynamiquement une methode sur une class - Argorate - 13-08-2013

Bonjour,

j'aimerais savoir s'il existe une autre solution qu'un "eval()" pour faire la chose suivante:


function Toto()
{
this.pleinDeFonction = function(){...}
}
Toto.f = function(){ alert('tralala'); }

function Titi()
{
this.pleinDautresFonction = function(){...}
}
Titi.f = function(){ alert('pouet pouet'); }

var klass = 'Toto';
klass.f(); // tralala
klass = 'Titi';
klass.f(); // pouet pouet

Une idée?


RE: [JS]Invoquer dynamiquement une methode sur une class - Xenos - 13-08-2013

Grâce à Stack overflow (comme toujours):

window[klass]


<html>
<head>
</head>
<body>
<script>
function Toto()
{
this.pleinDeFonction = function()
{
};
}
Toto.f = function()
{
alert('tralala');
}

function Titi()
{
this.pleinDautresFonction = function()
{
};
}
Titi.f = function(){
alert('pouet pouet');
}

var klass = 'Toto';
var Qlass = window[klass];
Qlass.f(); // tralala
klass = 'Titi';
var Qlass = window[klass];
Qlass.f(); // pouet pouet
</script>
</body>
</html>



RE: [JS]Invoquer dynamiquement une methode sur une class - srm - 13-08-2013

J'allais justement dire que tu aurais pu faire une recherche de 2mn, c'est le temps que ça m'a pris pour faire la recherche et bien lire toutes les solutions de stackoverflow et retenir comme solution la même que Xenos donne.


RE: [JS]Invoquer dynamiquement une methode sur une class - Xenos - 13-08-2013

Il m'a fallu 3 minutes, car j'avais essayé en mettant tout le script dans une fonction "tes()", appelé au @onload du /body, ce qui ne marchais pas :p
Donc je ne sais pas trop comment il faudrait faire si les fonctions étaient imbriquées...


RE: [JS]Invoquer dynamiquement une methode sur une class - Maks - 13-08-2013

Il faut l'écrire correctement, en mettant Toto et Titi en dehors de ta fonction test


RE: [JS]Invoquer dynamiquement une methode sur une class - Xenos - 13-08-2013

Effectivement, la bonne méthode consiste à déclarer les fonctions hors de la fonction test(). Mais comme c'était à l'arrachée, ça m'a pris 1 minute de plus pour sortir le code de la fonction test() ^^

Après, je ne sais pas comment tu comptes utiliser ce code Argorate, mais pense à bien vérifier que ta chaîne de caractères est valide avant de la faire exécuter, et que cela ne permet pas l'exécution de fonctions non désirées.


RE: [JS]Invoquer dynamiquement une methode sur une class - srm - 13-08-2013

Xenos si tu ne connais pas encore Argorate, je tiens à te préciser qu'il code toujours, ce même si l’on prend le temps de bien lui expliquer pourquoi il ne devrait pas faire comme ça et utiliser une autre méthode.

Un petit peu comme la discussion que l'on a eu ensemble Xenos, sauf que même en démontrant par A + B, il tient à continuer à faire de sa façon.


RE: [JS]Invoquer dynamiquement une methode sur une class - Maks - 13-08-2013

Citation :cela ne permet par l'exécution de fonctions non désirées.

c'est du code client, tu peux exécuter n'importe quelle fonction à la volée via la console


RE: [JS]Invoquer dynamiquement une methode sur une class - Argorate - 13-08-2013

En effet cela marche, sauf que c'est une sympathique cheat qui ne marche que dans le cas particulier où l'on est avec des variables globales, si la variable n'est pas atteignable par window, le problème reste là.

function Toto()
{
this.test=function(i){
var t;
if(i==1) t='func1';
else t='func2';

t();
};

this.func1=function()
{console.log('1');}

this.func2=function()
{console.log('2');}
}

new Toto().test(1);

Je suis justement dans un cas comme ça...


En php on peut vraiment interpréter à la volé en fiasant "$toto()", aucun équivalant donc?


RE: [JS]Invoquer dynamiquement une methode sur une class - Maks - 13-08-2013

Code :
if (i==1) t = this.func1;
else t = this.func2;

t();