IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Convertir contenu d'un String en renvoi vers la méthode


Sujet :

JavaScript

  1. #1
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut Convertir contenu d'un String en renvoi vers la méthode
    Bonjour,

    j'ai un petit problème pour ajouter dynamiquement des méthodes à mes objets à partir du nom de la méthode.

    Tout d'abord j'ai un fichier avec des méthodes particulières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //  FICHIER 1
    function maMethodeMachin(unParametre){
      blablabla;
    }
     
    function maMethodeTruc(unParametre){
      blablabla;
    }
    d'autre part j'ai un fichier xml qui décrit les propriétés de certains objets assez semblables mais certains ayant des méthodes particulières.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // FICHIER XML
    <UneChose Name="Bidule"/>
     
    <UneChose Name="Machin">
      <MethodeSpeciale Name="maMethodeMachin">
    </Objet>
     
    <UneChose Name="Truc">
      <MethodeSpeciale Name="maMethodeTruc">
    </Objet>
    dans mon code je récupère le fichier xml et je crée des "choses" en fonction des besoins (on demande unBidule OU unMachin OU ...).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //  FICHIER 2
    var unBidule = new Chose();
    var unMachin = new Chose();
    et c'est là que je bloque.
    Comment ajouter dynamiquement la méthode "maMethodeMachin" à unMachin ?
    J'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //  FICHIER 2
    var nomFonctionSpeciale = getNomFonctionSpecialeDepuisLeXML(); // ici je récupère un String qui vaut "maMethodeMachin"
    Mais ensuite ? Comment interpréter le contenue de nomFonctionSpeciale pour obtenir l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unMachin[nomFonctionSpeciale] = maMethodeMachin;
    Actuellement j'utilise un artifice dans le premier fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //  FICHIER 1
    function getMethode(unNomDeMethode){
      switch (unNomDeMethode){
       case "maMethodeTruc": return maMethodeTruc;
       case "maMethodeBidule": return maMethodeBidule;
       ... 
      }
    }
    mais ça oblige à compléter cette fonction dès que je rajoute une nouvelle méthode spéciale et il va y en avoir beaucoup.

    Je cherche quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unMachin[nomFonctionSpeciale] = FaisLeLienVers(maMethodeMachin);
    J'ai choisi cette approche car je ne voulais pas créer plein de classes supplémentaires à chaque fois qu'il fallait rajouter un comportement supplémentaire spécifique pour uneChose. Je précise que si j'utilise JavaScript ce n'est pas sur un site web, il n'y a pas de problème de version de navigateur etc....

    Merci pour votre aide,
    bon code,
    kerinel

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    je ferais un truc tout « simple » comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // nom de la fonction a appeller
    var f = "maFonction";
     
    // function attachée à l'objet global window
    function maFonction ( param){
      alert('Bien le bonjour de maFonction !\nparam : ' + param);
    }
    // function attachée à l'objet MesFct, namespace
    var MesFct = {
      "maFonction" : function( param){
          alert('Bien le bonjour de MesFct.maFonction ! !\nparam : ' + param);
      }
    }
    var o = {
      w_fct : window[f],
      mf_fct : MesFct[f]
    }
    o.w_fct('window');
    o.mf_fct('MesFct');

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    @NoSmoking : o.w_fct(); // Uncaught TypeError: o.w_fct is not a function(…)

    Pour que cela fonctionne, il faudrait écrire :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // function attachée à l'objet global window
    window.maFonction = function( param ){
      console.log('Bien le bonjour de maFonction !\nparam : ' + param);
    }

    Ce qui n'est pas conseillé !

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Citation Envoyé par danielhagnoul
    @NoSmoking : o.w_fct(); // Uncaught TypeError: o.w_fct is not a function(…)
    Bonjour Daniel, dans quel contexte obtiens tu cette erreur ?

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Bonjour Daniel, dans quel contexte obtiens tu cette erreur ?
    Chrome Version 54.0.2840.34 beta-m (64-bit)

    EDIT

    Object expected sur Microsoft Edge 38.14393.0.0 Microsoft EdgeHTML 14.14393

    TypeError: o.w_fct is not a function sur Firefox 51.0a2 (2016-09-28) (32 bits)

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Par curiosité, n'est-ce pas possible de faire cela avec la méthode eval() ?

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    @danielhagnoul :
    j'ai l'imression que l'on va au devant d'ennuis car je viens de tester sous (mise à jour automatique sauf peut être pour Edge)
    • FireFox 49.0.1 September 23, 2016
    • Chrome 53.0.2785.116 m (64-bit)
    • Microsoft Edge 25.10586.0.0 Microsoft EdgeHTML 13.10586

    et pas de soucis.

    Si le window.maFonction te chagrine, ce qui est compréhensible, on peut plus élégamment passer par une expression de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // déclaration de fonction
    function maFonction ( param){
      console.log('Bien le bonjour de maFonction !\nparam : ' + param);
    }
    // expression de fonction
    var maFonction = function( param){
      console.log('Bien le bonjour de maFonction !\nparam : ' + param);
    }
    Ma préférée restant le NameSpace.

    @Beginner. : Dès l'instant où il existe une autre possibilité autant oublier la méthode eval(), « eval is evil ».

  8. #8
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    @NoSmoking : il n'y a pas de problème avec ton code ! Désolé !

    C'est moi qui me suis fait piéger, en testant ton code dans le gestionnaire d'événement "load".

    Voir et tester le code ci-dessous.

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
      <meta http-equiv="cache-control" content="public, max-age=60">
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <meta name="author" content="Daniel Hagnoul">
      <title>Test</title>
      <style>
     
      </style>
      <script>
        'use strict';
          
        function maFunc(){
          console.log( "Bonjour" );
        }
          
        document.addEventListener( 'DOMContentLoaded', function( ev ){
          
        });
        
        window.addEventListener( 'load', function( ev ){
          
          function noFunc(){
            console.log( "Hello" );
          }
     
          if ( 'function' == typeof window.noFunc ){
            noFunc();
          } else {
            console.error( `window.noFunc n'existe pas` );
          }
          
          if ( 'function' == typeof window.maFunc ){
            maFunc();
          } else {
            console.error( `window.maFunc n'existe pas` );
          }
          
        });
      </script>
    </head>
    <body>
      <main>
     
      </main>
    </body>
    </html>

    Il y aura certainement d'autres personnes qui tomberont dans ce piège. Je pense plus particulièrement aux codes utilisant la notation arrow.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

Discussions similaires

  1. Convertir le contenu d'un String en type Long
    Par lian76us dans le forum Général VBA
    Réponses: 17
    Dernier message: 14/10/2015, 06h51
  2. Convertir une std::string de utf8 vers cp850
    Par dj.motte dans le forum SL & STL
    Réponses: 7
    Dernier message: 30/10/2008, 22h15
  3. Convertir le contenu d'une String en ligne de code
    Par DamS2502 dans le forum Langage
    Réponses: 5
    Dernier message: 29/04/2008, 07h40
  4. Réponses: 9
    Dernier message: 10/05/2007, 17h57
  5. [STRING]Contenu d'un String <> vers &lt; et &g
    Par TreizeSegments dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/08/2004, 08h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo