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 :

Création d'une classe en JS


Sujet :

JavaScript

  1. #1
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut Création d'une classe en JS
    Hello

    https://www.typescriptlang.org/play/index.html

    JS reste le langage que j'ai le plus de mal à appréhender, à chaque fois je me demande comment je dois faire pour faire l'équivalent d'une classe, il y a n façons de faire en JS ce qui ne m'aide pas. En regardant l'exemple fourni par Microsoft dans ses exemples Typescript/JS je comprends ceci :
    - les "classes" JS sont en fait juste des variables que l'on met en majuscule car tous les dev sont ok pour saisir des noms de classes en majuscule depuis des décennies, ces variables contiennent juste une fonction et c'est ce que JS appelle une classe,
    - un constructeur JS est juste une fonction ayant strictement le même nom que la classe que l'on souhaite créer ?
    - dans l'exemple de classe, pourquoi mettre une parenthèse après var Greeter = ? C'est pas possible de mettre fonction() directement ?
    - ligne 8 : return Greeter est exécuté quand exactement ?
    - pourquoi mettre des parenthèses après la fin de la définition de var Greeter = (function()) ligne 9 ?

    Il y a d'autres points qui ne m'aident pas, ce que j'ai déjà pu voir ailleurs :
    - au tout début d'une classe on met this dans une variables comme _ pour ne pas perdre le scope de this, du coup on peut faire _.uneMethode() partout. Qu'elle méthode est à privilégier ?
    - même question pour les objects {}, est-ce que je dois faire var MaClasse = (function() {}) ou alors { unTruc: function(a,b) {} } ?

    C'est pas clair dans ma tête et un peu d'aide serait la bienvenue.
    Exprimer une différence d'opinion vaut mieux que :

  2. #2
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    TypeScript target ES3 par défaut. C'est à dire qu'il transpile son code TypeScript en une version de JavaScript qui date de 1999 pour des raisons de compatibilité avec les vieux browsers.

    Le JavaScript de nos jours sait gérer les classes par défaut en natif. Tout dépend de ta plateforme d'exécution en fait.

    Quels sont tes navigateurs minimums à supporter ?

    Si tu n'as pas besoin de supporter IE (qui je le rappelle ne devrait plus être supporté car déprécié), tu peux utiliser les classes telles quelles sans avoir besoin d'un outil de transpilation (Babel ou TypeScript).
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  3. #3
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Si mes souvenirs sont bons tu te posais déjà des questions autour de cela et tu avais du mal à t'y retrouver eh bien dans ce cas peut-être que le plus simple pour toi serait d'utiliser les class ES6, tu peux alors avoir un code assez proche du code avec TypeScript... (D'ailleurs le type de code fourni par le compilateur TypeScript peut être fixé via des options...).

    Mais si tu veux faire autrement avec des constructeurs il y a plusieurs façons...

    Citation Envoyé par Aizen64 Voir le message
    dans l'exemple de classe, pourquoi mettre une parenthèse après var Greeter = ?
    Cela permet d'en faire une fonction immédiatement exécutée, une IIFE (Immediately-Invoked Function Expression). La fonction est exécutée au chargement du script...
    Citation Envoyé par Aizen64 Voir le message
    C'est pas possible de mettre fonction() directement ?
    Si c'est possible mais alors la fonction ne sera pas immédiatement exécutée, il faudra ajouter une instruction pour l’exécuter...

    Citation Envoyé par Aizen64 Voir le message
    ligne 8 : return Greeter est exécuté quand exactement ?
    Lorsque la fonction IIFE est exécutée (au chargement du script).

    En fait il faudrait que tu regardes des tutoriels sur les IIFE...

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Ah Marco46 a répondu entre temps...

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Aizen64, l’impression de complexité que tu as est normale. Le modèle objet de JS est bordélique pour des raisons historiques, commerciales, techniques et on pourrait presque même dire religieuses en ce qui concerne certaines personnes.

    En ES3 on a deux choses : les constructeurs, qui sont juste de bêtes fonctions, et les prototypes, qui sont le fondement théorique du modèle objet de JS. Et si on n’a pas une petite idée de comment marchent les prototypes, on va droit dans le mur, car tout JS repose là-dessus, même les class ES6 (et à plus forte raison celles de TypeScript).

    Et donc, traditionnellement, en JS on utilise cet unique combo constructeur + prototype pour définir une « classe », comme on peut trouver dans tous les tutos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function Bidule() {
      // code d’instanciation
      // ...
    }
     
    Bidule.prototype = {
      // propriétés et méthodes de la « classe »
      // ...
    };
    Et pour faire de l’héritage, ahem. Je me souviens de ces cours de maths au collège où je me contentais d’apprendre la formule sans chercher à comprendre. Ben là c’est pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function BiduleSpecial() {
      // ...
    }
    BiduleSpecial.prototype = new Bidule(); // parce que
    Et comme tout le monde fait comme ça depuis des années, les moteurs JS (V8, SpiderMonkey, etc.) sont optimisés pour ce cas de figure. Il me semble que cette histoire de hidden classes commence à être assez connue aujourd’hui.

    Il a fallu attendre ES5 (quelqu’un me corrige si je me trompe) pour que JavaScript assume pleinement sa nature de langage à prototypes en se dotant de la fonction Object.create(). Avec elle, plus besoin de constructeurs.
    Mais c’est une façon de penser radicalement différente, et peut-être que la vraie question à se poser ici est « ai-je vraiment besoin de trouver un équivalent aux classes dont j’ai l’habitude dans les autres langages ? »

    Tout ça a été débattu en détail dans la discussion L’opérateur new, bonne ou mauvaise pratique ?

    À propos du mot-clé this, c’est une histoire de liaison de contexte. Une fonction déclarée avec le mot-clé function a une liaison dynamique. Pour faire simple, le contexte this sera ce qui se trouve « avant le point » au moment de l’appel. Par exemple, dans monObjet.methode(), au sein de methode() le contexte sera monObjet. S’il n’y a rien devant le point, ce sera soit window, soit undefined selon le mode (et je t’encourage vivement à toujours utiliser le mode strict).
    Le problème se pose quand on utilise une fonction de rappel, par exemple pour une requête ajax.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    req.onload = function () {
      // quel sera le contexte ici ?
    };
    Autre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    setTimeout(function () {
      // quel sera le contexte ici ?
    }, 1000);
    C’est pour cette raison qu’on met this dans une variable. Bien sûr, on peut bidouiller avec les méthodes .call(), .apply() ou .bind(), mais ça a tendance à embrouiller à la maintenance.
    Alternativement, on peut utiliser les fonctions flèches d’ES6.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Création d'une classe ASP (connection & recordset)
    Par polothentik dans le forum ASP
    Réponses: 1
    Dernier message: 12/03/2008, 00h46
  2. [POO] création d'une classe de connexion
    Par artotal dans le forum Langage
    Réponses: 1
    Dernier message: 14/02/2008, 12h01
  3. Réponses: 3
    Dernier message: 06/05/2007, 19h46
  4. [C++] Création d'une classe dans un fichier
    Par Pfeffer dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/05/2007, 15h49
  5. Création d'une class contenant un TEdit (Débutant)
    Par Dereck07 dans le forum Delphi
    Réponses: 5
    Dernier message: 01/05/2007, 17h02

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