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 :

récupérer le nom d'une classe javascript


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut récupérer le nom d'une classe javascript
    bonjour,

    le contexte : je crée des classes (new xxxx()) que je stock dans un array,
    chaque classe stockée doit être unique, pour cela, j'aurais besoin de connaitre le nom de chaque classe pour la stocker en tant que clé.

    le but est de pouvoir récupérer une classe stockée par la suite avec une fonction du genre recupclasse(maclasse());

    mais je ne sais pas du tout comment faire ça en javascript....

    merci pour votre aide, j'ai essayé de chercher sur le net, mais le problème c'est que les résultats parlent des class de balise... rien à voir...

    accessoirement j'ai une variable publique (name) dans mes classes que t'utilise, mais bon, je ne trouve pas ça super...

  2. #2
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Citation Envoyé par dark poulpo Voir le message
    bonjour,

    le contexte : je crée des classes (new xxxx()) que je stock dans un array,
    chaque classe stockée doit être unique, pour cela, j'aurais besoin de connaitre le nom de chaque classe pour la stocker en tant que clé.

    le but est de pouvoir récupérer une classe stockée par la suite avec une fonction du genre recupclasse(maclasse());

    mais je ne sais pas du tout comment faire ça en javascript....

    merci pour votre aide, j'ai essayé de chercher sur le net, mais le problème c'est que les résultats parlent des class de balise... rien à voir...

    accessoirement j'ai une variable publique (name) dans mes classes que t'utilise, mais bon, je ne trouve pas ça super...
    il n'y a pas de classe en javascript
    et
    Citation Envoyé par dark poulpo Voir le message
    bonjour,

    le contexte : je crée des classes (new xxxx()) ...
    ceci crée un objet pas une classe. quant à xxxx c'est une fonction pas une classe

    si la question est de savoir quelles sont les fonctions définies le sujet a déjà été abordé il y a peu.

    A+jyt

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 183
    Par défaut
    Même s'il n'y a pas de classes, à partir du moment où tu as créé un "schéma" à partir du quel tu fait des instances, on ne peut qu'appeler cela une classe.

    Même si on appelle cela un "prototype".

    Et malheureusement derrière on parle de classe une fois que tu l'as créé, et ce dans tous les frameworks c'est bien une classe que tu écris, et évidement des instances que tu fais de cette classe.

    Ca peut paraître stupide de raisonner avec des Classes dans un langage qui n'en est pas pourvu, mais le besoin s'en fait ressentir, notamment quand tu as besoin de faire faire une tache spécifique à une classe, dans un contexte précis, dans ce cas cas, tu fais une nouvelle classe qui hérite de celle-ci.

    J'ai une question, qui peut justement paraître conne, mais si JS n'a pas de classe, comme on le sait tous, comme on va appeler cela :
    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
     
    var Animal = function(options) {
        this.init(options);
    };
    Animal.prototype = {
       constructor : Animal.constructor,
       init : function(options) {
     
       },
     
        bruit : function() {
           alert(bruit)
        }
     
    }

  4. #4
    Membre confirmé
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    merci pour ta réponse, malheureusement, après avoir lu le topic indiqué, ça ne résout pas mon problème... je'ai besoin de connaitre le nom de la "fonction" (pas class) fournis en paramètre d'une fonction X

  5. #5
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Citation Envoyé par arnogues Voir le message
    Même s'il n'y a pas de classes, à partir du moment où tu as créé un "schéma" à partir du quel tu fait des instances, on ne peut qu'appeler cela une classe.
    non justement ça ne s'appelle pas une classe
    ce n'est pas parce qu'à l'école on vous apprend la POO en se basant sur la POO à base de classe que programmer en objet nécessite des classes.

    la théorie des langages à objet est bien plus large que cela.
    Citation Envoyé par arnogues Voir le message
    Même si on appelle cela un "prototype".
    Et malheureusement derrière on parle de classe une fois que tu l'as créé, et ce dans tous les frameworks c'est bien une classe que tu écris, et évidement des instances que tu fais de cette classe.
    là encore non et re non.

    non tu ne fais pas de classe en définissant un prototype et non tu ne crée pas nécessairement d'instance pour faire un objet.

    la grande majorité des langage à base de classes ne connaissent pas la notion d'objet mais uniquement d'instance. Mais ce n'est pas le cas de tous les langage et javascript fait partis de ceux qui ne connaissent pas la notion de classe et connaissent la notion d'objet. en js on peut créer un objet sans définition prototype.
    Citation Envoyé par arnogues Voir le message
    Ca peut paraître stupide de raisonner avec des Classes dans un langage qui n'en est pas pourvu, mais le besoin s'en fait ressentir, notamment quand tu as besoin de faire faire une tache spécifique à une classe, dans un contexte précis, dans ce cas cas, tu fais une nouvelle classe qui hérite de celle-ci.
    là encore ce n'est pas nécessaire et oui c'est stupide. js connait la notion d'héritage bien plus riche que l'héritage de classe. c'est comme dire je connais le vélo alors pour organiser le fret en Europe on n'utilisera que le vélo. mieux vaut apprendre les capacité de js et le utiliser à bon escient que de le détourner pour essayer de reproduire d'autre langage.
    Citation Envoyé par arnogues Voir le message
    J'ai une question, qui peut justement paraître conne, mais si JS n'a pas de classe, comme on le sait tous, comme on va appeler cela :
    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
     
    var Animal = function(options) {
        this.init(options);
    };
    Animal.prototype = {
       constructor : Animal.constructor,
       init : function(options) {
     
       },
     
        bruit : function() {
           alert(bruit)
        }
     
    }
    ça s'appelle simplement un prototype tout simplement.

    A+JYT

  6. #6
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Citation Envoyé par dark poulpo Voir le message
    merci pour ta réponse, malheureusement, après avoir lu le topic indiqué, ça ne résout pas mon problème... je'ai besoin de connaitre le nom de la "fonction" (pas class) fournis en paramètre d'une fonction X
    comme je l'ai dit le sujet à déjà été traité dans le forum

    une petite recherche sur comment lister les fonctions définies et tu auras ta réponse.

    A+JYT

  7. #7
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Citation Envoyé par dark poulpo Voir le message
    je crée des classes (new xxxx()) que je stock dans un array,
    chaque classe stockée doit être unique, pour cela, j'aurais besoin de connaitre le nom de chaque classe pour la stocker en tant que clé.

    le but est de pouvoir récupérer une classe stockée par la suite avec une fonction du genre recupclasse(maclasse());
    Sans vouloir intervenir dans le débat « classe / pas classe » (), j'ai juste envie de dire : l'idée de départ ne me paraît pas bonne. Dark Poulpo, je reprends tes propres termes, tu cherches à stocker des constructeurs (on va appeler ça comme ça), de manière unique, en les identifiants à l'aide de clés. Pourquoi ne pas utiliser un objet associatif ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var mesConstructeurs = {
       "C1": function C1( ... ){
          ...
       },
       "C2": function C2( ... ){
          ...
       },
       etc.
    };
    À l’utilisation, tu peux construire tes objets comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var monObjet1 = new mesConstructeurs.C1(...);
    // ou bien
    var monObjet1 = new mesConstructeurs["C1"](...);
    Et si tu en as vraiment besoin, tu peux récupérer dynamiquement le constructeur comme l'a indiqué Arnogues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function recupclasse( obj ) { return obj.constructor; }
    Ou bien le nom du constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function recupclasse( obj ) { return obj.constructor.name; }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  8. #8
    Membre confirmé
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    en réponse à watilin :

    en fait je suis en train de traduire un code à moi que j'avais fais en c#.net sur le principe design entity - system pour un moteur 3d (à la base xna) que je veux faire en webgl pour plus de portabilité.

    (actuellement j'ai stocké une variable nom avec le nom du PROTOTYPE) pour l'utiliser comme clé

    j'ai cru voir quelque part un moyen de faire de l'héritage de prototype (comme un héritage de classe pour ma traduction de mon code) donc je n'aurais qu'a écraser ma variable publique par le nom du prototype hérité...

    le problème avec l'exemple que tu me donnes c'est que dans un exemple comme celui-ci

    prototype A -> constructor.name retourne "function", moi j'ai besoin d'avoir le mot A

    (j'ai essayé aussi avec constructor et ça me retourne "Function() { [native code] }")

    prototype B qui hérite de A -> besoin d'avoir le mot B

    ps : (je viens de lire un exemple sur le net, je vais réessayer avec ce que tu m'as dit pour constructor.name)

    et donc je vais stocker dans un même Array des object new A(), new B(), .... (qui sont unique, pas 2 fois A, ou B, ... dans l'array)

    mais pour retrouver l'objet A, B, je comptais donner en argument A, B, ...
    actuellement avec mon système (temporaire ou définitif si pas mieux), j'utilise donc cette variable nom ="A/B/C/..." stocké en publique dans chaque prototype

    je n'ai pas besoin d'expliquer pourquoi je dois faire des prototypes hérités car je pense que tout le monde connait l'utilité des classes hérités dans d'autres langages...

    maintenant si vous connaissez des moyens propres pour javascript d'obtenir les même résultats....

  9. #9
    Membre confirmé
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    c'est bon ça marche comme ça, merci à vous

  10. #10
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Tu as adopté quelle solution du coup ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  11. #11
    Membre confirmé
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    bein en fait ça ne marche que à moitié...

    j'explique la logique de mon code (ne change pas car elle est propre à la logique de conception du moteur)

    pour faire simple dans la compréhension

    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
     
    // p_systems[parametre.constructor.name] = parametre; ( == p_systems["SystemBase"] = parametre; )
    engine.RegisterSystem(new SystemBase());
     
    // p_systems[parametre.constructor.name] = parametre; ( == p_systems["SystemUpdate"] = parametre; )
    engine.RegisterSystem(new SystemUpdate()); 
     
     
    // c'est ici que ça bloque
    var s = engine.GetSystem(SystemUpdate); 
    // return p_systems[parametre.constructor.name];
    /*
     sauf que parametre.constructor.name == "Function", moi j'aurais voulu "SystemUpdate"
    mais je ne veux pas mettre un string en paramètre ça fait moche
    et pour la personne qui dev c'est moyen vu que des éditeurs peuvent
    te proposer la liste des prototype, fonction... qui est plus pratique 
     
    */

  12. #12
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    mais à quoi ça sert ?

    je ne comprends vraiment pas
    si tu hérite de quelque chose c'est automatique tu n'as pas besoin de bidouiller les non de prototype c'est comme en c#

    A+JYT

  13. #13
    Membre confirmé
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    comment ça à quoi ça sert??

    getsystem() permet de recuperer le system préalablement enregistré...

    en c# c'est l'équivalent de ça que je souhaite faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    public T GetSystem<T>() where T : ISystemBase
    {
          if (!p_systems.ContainsKey(typeof(T))) return default(T);
          return (T)(p_systems[typeof(T)]);
    }
     
    public void RegisterSystem(ISystemBase es)
    {
          if (!p_systems.ContainsKey(es.GetType())) p_systems.Add(es.GetType(), es);
    }
    pour ce type d'utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    xnaEngine1.World.RegisterSystem(new SystemShader());
     
    xnaEngine1.World.GetSystem<SystemShader>().LoadAllAssets();

  14. #14
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    non je ne parle pas du code pour gérer un registre je sais ce qu'est un registre

    ce que je ne comprends pas c'est pourquoi tu as besoin d'un registre de touts tes prototypes?


    A+JYT

  15. #15
    Membre confirmé
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    non ce ne sont pas tous les prototypes, seulement ceux qui sont nécessaires pour l'utilisation voulu...

    et je ne peux pas les lister à la base, car la personne qui utilise le moteur (pour dev un outils) peut créer ses propres systems

    mais là on s'écarte un peu non?

    je souhaite obtenir l'équivalent du code c# fournis juste au dessus...

    le problème n'est pas pour enregistrer mon prototype, c'est pour le récupérer...

    mais j'ai l'impression que on arrive pas à se comprendre (des 2 cotés)

    toi tu écrirais quoi comme code? comme ça ce sera plus claire que du français... lol

  16. #16
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function test() {}//un constructeur
    function g(obj) {
       alert(obj.constructor.name)//affiche le nom du constructeur de l'objet passé en paramètre.
    }
     
    g(new test()); // affiche test

    A+JYT

  17. #17
    Membre confirmé
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    bein jusque là nous sommes ok, ça correspond à ma 1ere partie (sauf que moi au lieu de alert, je stock l'objet (crée par new ...) dans mon Array().

    par contre pour le récuperer tu ferais quoi?

    actuellement j'ai trouvé une soluce pas tip top...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var s = engine.GetSystem(SystemUpdate);
     
     
     
     
     
     
    this.GetSystem = function(system)
    {
            var reg=new RegExp("^function ([a-zA-Z0-9_]+)","g");  
            var f = reg.exec(system.toString())[1];
            return p_systems[f];
    }

  18. #18
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Attention, est-ce que nous parlons du constructeur (= la fonction), ou de l'objet construit ?
    Citation Envoyé par dark poulpo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var s = engine.GetSystem(SystemUpdate);
    Ça renvoie "Function" et c'est normal, car SystemUpdate est une fonction. En revanche, engine.GetSystem(new SystemUpdate()) renverrait bien "SystemUpdate".

    Si tu veux simplement récupérer le nom du constructeur, rien n'est plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    this.GetSystem = function(system)
    {
            return system.name;
    }
    Au passage, si tu utilises plusieurs objets du type de engine à la fois, tu gagneras en performances en déclarant la fonction GetSystem sur le prototype de ton engine, plutôt que sur this. De manière générale, c'est souvent une mauvaise idée de déclarer des fonctions sur this.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  19. #19
    Membre confirmé
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Par défaut
    super!!! +1

    on peut passer en résolu je pense

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le nom d'une classe et d'une méthode
    Par hanubis37 dans le forum Langages
    Réponses: 2
    Dernier message: 21/11/2014, 11h50
  2. Réponses: 22
    Dernier message: 19/01/2011, 10h00
  3. Récupérer le nom d'une Sous-classe
    Par rambc dans le forum Général Python
    Réponses: 9
    Dernier message: 05/06/2009, 14h33
  4. récupérer le nom d'une image dans un javascript
    Par adoptioninternationa dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/06/2008, 15h36
  5. [javascript]Récupérer le nom d'une image
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/10/2005, 13h56

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