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 :

Conversion code JS en POO


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Points : 28
    Points
    28
    Par défaut Conversion code JS en POO
    Bonjour bonjour,

    Je suis en train de convertir mon code en POO avec des class.
    Seulement voilà, pour certains fichiers je m'en sors pas trop.

    J'ai une map google intégrée à mon site. (La fonction n'est pas lancée dans le JS mais je passe dans l'url le "callback=createMap.initMap".)
    Seulement voilà, après moult tentatives, je ne parviens pas à faire apparaitre ma carte lorsque je tente de passer mon code en class.. Si quelqu'un peut m'aider..

    Mon code est dispo à cette adresse : http://velocdwj.eu3.biz
    Il s'agit du fichier map.js

    (J'espère réussir à passer le fichier markers.js en class une fois que la map le sera )

    Merci !

  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
    Citation Envoyé par Elztx Voir le message
    Je suis en train de convertir mon code en POO avec des class.
    Ne fait pas ça, ça n'a absolument aucun intérêt. Rien de rien. Tu ne vas seulement te faire des noeuds dans le cerveau.

    Les classes peuvent être utiles pour définir des modèles de données, et si tu rentres dans ce genre de choses autant utiliser TypeScript.

    En JS vanilla ça n'a pas le moindre intérêt, les classes ne sont pas des types et n'ont aucune espèce d'existence sous cette forme.

    Il n'y a aucune différence entre :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Rectangle {
      constructor(hauteur, largeur) {
        this.hauteur = hauteur;
        this.largeur = largeur;
      }
    }
     
    const monRectangle = new Rectangle(100, 200);

    et

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function creerRectangle(hauteur, largeur) {
      return {
        hauteur,
        largeur
      };
    }
     
    const monRectangle = creerRectangle(100, 200);

    Le deuxième code est d'ailleurs meilleur, il évite d'utiliser l'opérateur new qui a le sale défaut d'être oublié.
    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
    Nouveau membre du Club Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Points : 28
    Points
    28
    Par défaut
    Hello,

    Merci pour ta réponse,
    En effet je suis plus que d'accord pour les noeuds dans le cerveau ahahah.

    Mais voilà, le projet étant réalisé dans le cadre d'une formation, on nous l'impose désormais (ce qui n'était pas le cas avant)..

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2019
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2019
    Messages : 91
    Points : 153
    Points
    153
    Par défaut
    Vite fait

    tu peux utiliser le playground de babel on line.

    en testant à gauche la poo class et a droite voir le resultat ( function) avec l'option es2015-loose. ( c'est pas exactement ce que tu veux mais tu peux tester ton refractoring)


    https://babeljs.io/repl#?babili=fals...ternalPlugins=

  5. #5
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Points : 2 006
    Points
    2 006
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    ...
    Euh si si, la version un est propre et élégante

  6. #6
    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
    Citation Envoyé par Elztx Voir le message
    Mais voilà, le projet étant réalisé dans le cadre d'une formation, on nous l'impose désormais (ce qui n'était pas le cas avant)..
    Histoire d'être certain d'avoir bien compris : Dans une formation avec du JavaScript on vous impose de faire de la POO avec des classes en JavaScript ? J'ai bon ?

    On peut connaitre le nom de cette formation ?

    EDIT : Pour ton problème tu as la solution dans mon premier message.

    Ton objet createMap doit provenir d'une classe qui va avoir comme propriété url et map et une fonction initMap et une fonction setMarker.

    Tu instancies ton objet et c'est bon.
    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

  7. #7
    Nouveau membre du Club Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Histoire d'être certain d'avoir bien compris : Dans une formation avec du JavaScript on vous impose de faire de la POO avec des classes en JavaScript ? J'ai bon ?

    On peut connaitre le nom de cette formation ?
    C'est ça.. Ils imposent des class désormais. Mon code est actuellement fonctionnel et j'en suis au résultat demandé dans le projet.. mais du coup je dois modifier une partie de mon projet afin de rentrer dans les critères de class et je bloque totalement là, je m'arrache un peu les cheveux, dès que je touche un truc y a plus rien qui marche...

  8. #8
    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
    Très mauvaise formation.

    Je comprends mieux.

    Bref, comme je te disais il suffit de faire comme dans mon exemple initial.

    Donc par exemple ça :

    Code javascript : 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
     
    var createMap = {
        url: "https://api.jcdecaux.com/vls/v1/stations?contract=Lyon&apiKey=67c4688df481c3a0da62ebfb2eb8619cca1a3542",
        map: null,
        initMap: function () { // Creation Map
            "use strict";
            this.map = new google.maps.Map(document.getElementById('map'), {
                center: {lat: 45.750000, lng: 4.850000},
                zoom: 15
            });
        },
     
        setMarker: function () {                             // Creation marqeurs
            var manager = Object.create(MarkerManager);     // Creation objet avec MarkerManager prototype
     
            ajaxGet(this.url, function (reply) {
                var locations = JSON.parse(reply);          // Creation array avec la réponse de l'API
                locations.forEach(function (location) {      // For each "location" de l'array "locations"
                    manager.add(location);                 // Creation d'un nouveau marqueur
                //manager.showDetails(location);        // Montrer les détails du marqueur au clic
                });
                manager.pushMarker();                       // Creation du MarkerClusterer
            });
        }
     
    };

    devient quelque chose comme ça :

    Code javascript : 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
     
    class MapCreator {
    	constructor(url) {
    		this.url = url;
    		this.map = null;
    	}	
     
    	initMap() { // Creation Map
    		this.map = new google.maps.Map(document.getElementById('map'), {
    			center: {lat: 45.750000, lng: 4.850000},
    			zoom: 15
    		});
    	}
     
    	setMarker() {
    		var manager = Object.create(MarkerManager);     // Creation objet avec MarkerManager prototype
     
            ajaxGet(this.url, function (reply) {
                var locations = JSON.parse(reply);          // Creation array avec la réponse de l'API
                locations.forEach(function (location) {      // For each "location" de l'array "locations"
                    manager.add(location);                 // Creation d'un nouveau marqueur
                //manager.showDetails(location);        // Montrer les détails du marqueur au clic
                });
                manager.pushMarker();                       // Creation du MarkerClusterer
            });
    	}
    }
     
    const createMap = new MapCreator('https://api.jcdecaux.com/vls/v1/stations?contract=Lyon&apiKey=67c4688df481c3a0da62ebfb2eb8619cca1a3542');
    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

  9. #9
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Points : 2 006
    Points
    2 006
    Billets dans le blog
    1
    Par défaut
    C'est très positif au contraire que l'on commence à former les développeurs JavaScript à travailler comme des gens normaux

  10. #10
    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
    Citation Envoyé par Sodium Voir le message
    C'est très positif au contraire que l'on commence à former les développeurs JavaScript à se prendre les pieds dans le tapis
    Fixed That For You

    Le problème est que les classes en JS sont une illusion. Écris class A {} puis typeof A, tu verras que ça renvoie "function".
    Écris class B { uneMethode() {} }, tu verras que tu peux accéder à uneMethode via B.prototype. Le vrai mécanisme sous-jacent, c’est un couple constructeur + prototype, une mécanique bancale qui existe uniquement parce que les responsables techniques de Netscape ont exigé de Brendan Eich qu’il incorpore le mot-clé new dans le langage qu’ils lui avaient demandé de créer, alors qu’il avait déjà un modèle à prototypes opérationnel.

    La syntaxe class cache cet aspect de la chose aux débutantes et débutants. On devrait au contraire leur apprendre à utiliser Object.create() et les concepts associés, qui sont bien plus intuitifs.

    Edit : je mets ça ici, ça commence à dater mais c’est toujours d’actualité L’Opérateur new, bonne ou mauvaise pratique ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  11. #11
    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
    Citation Envoyé par Marco46 Voir le message
    Le deuxième code est d'ailleurs meilleur, il évite d'utiliser l'opérateur new qui a le sale défaut d'être oublié.
    J'avoue que je suis un peu d'accord avec Sodium sur ce coup-là, on est d'accord que les class c'est juste du sucre syntaxique mais en fait ça aide car c'est plus lisible, c'est plus proche de ce que l'on fait ailleurs (en java par exemple) et ça peut permettre de passer à typescript plus facilement si c'est ce qu'on souhaite.

    Là tu as pris un exemple simple mais si par exemple on commence à faire des class dérivées, cela devient encore plus lisible avec les class...
    Et même au niveau du débogage je trouve que cela aide...

    Et aussi au début cela peut paraitre étrange d’utiliser des fonctions de cette manière (pour construire des objets) d’ailleurs quand une fonction est utilisée comme constructeur (ce qui n'est pas le cas de ton deuxième exemple) on convient de mettre la première lettre de son nom en majuscule... Et avec une fonction constructeur aussi on peut utiliser l’opérateur new...

    Sinon petite parenthèse il me semble que les deux exemples ne sont pas équivalents, le deuxième (qu'on appelle fonction usine je crois...) risque de consommer plus de mémoire si on ajoute des données, des méthodes...
    Oui car la fonction creerRectangle renvoi un objet et à chaque appel un nouvel objet est crée alors avec le premier exemple aussi sauf que si j'ajoute des méthodes par exemple eh bien dans le premier elles seront ajoutées au prototype et seront donc communes/partagées avec toutes les instances alors que la fonction creerRectangle crée un nouvel objet à chaque fois avec ses propres méthodes.

    Je pense que ce qui est plus proche du premier cas c'est la fonction constructeur il me semble... Et alors soit on utilise l’opérateur new soit Object.create() soit... Mais dans ces cas je ne suis pas sûr que ce soit plus lisible...

    Au sujet de l'oubli de new : Avec les class le navigateur nous averti sur Chrome on a : Uncaught TypeError: Class constructor Rectangle cannot be invoked without 'new' donc pas moyen de se retrouver avec un bogue difficile à repèrer... Ce n'est pas le cas je crois avec les fonctions constructeurs...

    Bon c'est juste un avis, c'est aussi une question de goût et d'habitude et l’influence de certains langages...

    Citation Envoyé par Watilin Voir le message
    Edit : je mets ça ici, ça commence à dater mais c’est toujours d’actualité :) L’Opérateur new, bonne ou mauvaise pratique ?
    Ah cela me rappelle des souvenirs...

  12. #12
    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
    Citation Envoyé par Beginner. Voir le message
    Au sujet de l'oubli de new : Avec les class le navigateur nous averti sur Chrome on a : Uncaught TypeError: Class constructor Rectangle cannot be invoked without 'new' donc pas moyen de se retrouver avec un bogue difficile à repèrer... Ce n'est pas le cas je crois avec les fonctions constructeurs...
    Avec new.target on peut imiter ce comportement. Mais du coup, on peut se demander quel intérêt on a d’utiliser ça plutôt que class. Personnellement, la syntaxe new.target me déplaît fortement.

    Pour l’anecdote, on peut aussi faire l’inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function machin() {
      if (new.target) throw Error("Don’t use new");
    }
    Dans la même idée, les fonctions lambdas ne peuvent pas être utilisées comme des constructeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const chose = () => {};
    new chose(); // TypeError: chose is not a constructor
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  13. #13
    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
    Citation Envoyé par Engiwip Voir le message
    Vite fait

    tu peux utiliser le playground de babel on line.

    en testant à gauche la poo class et a droite voir le resultat ( function) avec l'option es2015-loose. ( c'est pas exactement ce que tu veux mais tu peux tester ton refractoring)


    https://babeljs.io/repl#?babili=fals...ternalPlugins=
    Ah ben lui il utilise bien une fonction constructeur... Et là cela se ressemble plus :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Rectangle {
      constructor(hauteur, largeur) {
        this.hauteur = hauteur;
        this.largeur = largeur;
      }
    }
     
    const monRectangle = new Rectangle(100, 200);
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var Rectangle = function Rectangle(hauteur, largeur) {
      "use strict";
     
      this.hauteur = hauteur;
      this.largeur = largeur;
    };
     
    var monRectangle = new Rectangle(100, 200);

    Après si on fait d'autres choses héritage ou autre, avec les class ça reste lisible et la syntaxe est plus facile à retenir...

    Exemple :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Rectangle {
      constructor(hauteur, largeur) {
        this.hauteur = hauteur;
        this.largeur = largeur;
      }
    }
     
    const monRectangle = new Rectangle(100, 200);
     
    class derive extends Rectangle {
      constructor(hauteur, largeur) {
        super (hauteur, largeur);
      }
    }
    Code javascript : 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
    function _inheritsLoose(subClass, superClass) {
      subClass.prototype = Object.create(superClass.prototype);
      subClass.prototype.constructor = subClass;
      subClass.__proto__ = superClass;
    }
     
    var Rectangle = function Rectangle(hauteur, largeur) {
      "use strict";
     
      this.hauteur = hauteur;
      this.largeur = largeur;
    };
     
    var monRectangle = new Rectangle(100, 200);
     
    var derive =
      /*#__PURE__*/
      (function(_Rectangle) {
        "use strict";
     
        _inheritsLoose(derive, _Rectangle);
     
        function derive(hauteur, largeur) {
          return _Rectangle.call(this, hauteur, largeur) || this;
        }
     
        return derive;
      })(Rectangle);

    Un simple héritage et déjà la différence de lisibilité se voit... Bon c'est vrai que c'est fait automatiquement, un humain ferait plus lisible mais bon peut-être pas aussi lisible qu'avec les class et encore une fois c'est une syntaxe plus simple et donc plus facile à retenir et donc moins de risque d'erreur...

  14. #14
    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
    Citation Envoyé par Watilin Voir le message
    Avec new.target on peut imiter ce comportement. Mais du coup, on peut se demander quel intérêt on a d’utiliser ça plutôt que class. Personnellement, la syntaxe new.target me déplaît fortement.
    Ah je ne connaissais pas, je vais regarder ça... Merci.

  15. #15
    Nouveau membre du Club Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Marco46 Voir le message

    Code javascript : 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
     
    class MapCreator {
    	constructor(url) {
    		this.url = url;
    		this.map = null;
    	}	
     
    	initMap() { // Creation Map
    		this.map = new google.maps.Map(document.getElementById('map'), {
    			center: {lat: 45.750000, lng: 4.850000},
    			zoom: 15
    		});
    	}
     
    	setMarker() {
    		var manager = Object.create(MarkerManager);     // Creation objet avec MarkerManager prototype
     
            ajaxGet(this.url, function (reply) {
                var locations = JSON.parse(reply);          // Creation array avec la réponse de l'API
                locations.forEach(function (location) {      // For each "location" de l'array "locations"
                    manager.add(location);                 // Creation d'un nouveau marqueur
                //manager.showDetails(location);        // Montrer les détails du marqueur au clic
                });
                manager.pushMarker();                       // Creation du MarkerClusterer
            });
    	}
    }
     
    const createMap = new MapCreator('https://api.jcdecaux.com/vls/v1/stations?contract=Lyon&apiKey=67c4688df481c3a0da62ebfb2eb8619cca1a3542');
    Merci, j'avais essayé quelque chose de similaire mais ça ne fonctionne toujours pas.. j'avais eu un problème similaire au début du projet, un camarade m'avait conseillé de passer l'url dans le callback au lieu d'appeler la fonction dans mon fichier js pour pallier au problème de "carte grise" qui ne s'affiche donc pas..
    Peut-être est-ce un problème d'ordre de fichiers au chargement ?

    (j'ai retiré mon fichier markers.js + markerclusterer.js qui entraient en conflit avec le fichier maps pour essayer; mais rien.. pas d'erreur dans la console non plus.. juste un rectangle gris au lieu de la map google)

  16. #16
    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
    Citation Envoyé par Beginner. Voir le message
    on est d'accord que les class c'est juste du sucre syntaxique mais en fait ça aide car c'est plus lisible, c'est plus proche de ce que l'on fait ailleurs (en java par exemple)
    Du coup c'est pas que c'est plus lisible, c'est juste que t'es habitué à Java alors tu te sers des classes pour définir des modèles comme pour structurer ton code à la place d'utiliser des modules. En bref tu voudrais faire du Java en JS. C'est une erreur qui te fait entrer dans un monde de confusion et de quiproquo, tout ce que les informaticiens doivent détester viscéralement pour être efficaces.

    En JavaScript faire ça n'a aucun sens :

    - Les classes ne sont pas des types, il n'y a pas de plus-value à utiliser des classes au lieu de factory functions ou mieux Object.create.
    - En JS on a des modules pour structurer le code, les classes sont inutiles pour ça, pire elles nuisent à la lisibilité, tu vas avoir un module qui contient une classe qui contient un ensemble de fonctions.

    L'argument qui consiste à dire "je suis habitué à Java donc je veux que tous les langages que j'utilise ressemblent à Java" est un très mauvais argument.

    Pour en revenir au tuto, la demande des formateurs est idiote. Ça ne sert absolument à rien de demander une classe dans ce contexte le fichier map.js doit être un module. C'est ça la bonne abstraction en JS pour structurer du code.

    Citation Envoyé par Beginner. Voir le message
    c'est plus proche de ce que l'on fait ailleurs (en java par exemple) et ça peut permettre de passer à typescript plus facilement si c'est ce qu'on souhaite.
    TypeScript n'a pratiquement aucun rapport avec Java c'est même quasiment l'inverse, l'un est uniquement statique l'autre est statique et dynamique, et l'un est structurel alors que l'autre est nominal. C'est juste le grand écart. Quand un dev te dit que c'est facile de passer de Java à TS il faut prendre ça comme une preuve qu'il n'a pas pris le temps d'étudier le langage. C'est au contraire une source de confusion majeure.
    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

  17. #17
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    Citation Envoyé par Elztx Voir le message
    Merci, j'avais essayé quelque chose de similaire mais ça ne fonctionne toujours pas..
    De ce que je vois, google cherche quelque chose sur window.
    Il faudrait essayer var à la place de const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var createMap = new MapCreator('https://api.jcdecaux.com/vls/v1/stations?contract=Lyon&apiKey=67c4688df481c3a0da62ebfb2eb8619cca1a3542');
    Avec var, window.createMap sera défini, contrairement à si on utilise let ou const.

  18. #18
    Nouveau membre du Club Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Points : 28
    Points
    28
    Par défaut
    Hello,
    Merci pour ta réponse, mais ça ne fonctionne toujours pas.. je suis un peu perdue...

  19. #19
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Citation Envoyé par Elztx Voir le message
    je suis un peu perdue...
    C'est ça le vrai problème !
    Il faut penser à faire des affichages un peu partout, désactiver du code, tester dans des fichiers simplifiés etc.
    Même en étant débutant, on arrive ainsi à cerner la plupart des problèmes.

    Ici, je conseille de partir d'un exemple simplifié.
    Si je reprends les balises de script du site et l'exemple de Marco46, en remplaçant const par var, j'ai bien la fonction qui est appelée et une carte qui s'affiche.

    test.html
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div id="map" style="width:500px;height:300px;"></div>
    <script type="text/javascript" src="map.js"></script>
    <script async="" defer="" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBUsRAUURmSMoNGrVVABrRFWUQtcu-GSgQ&amp;callback=createMap.initMap"></script>
    map.js
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    class MapCreator {
    	constructor(url) {
    		this.url = url;
    		this.map = null;
    	}	
     
    	initMap() { // Creation Map
    		this.map = new google.maps.Map(document.getElementById('map'), {
    			center: {lat: 45.750000, lng: 4.850000},
    			zoom: 15
    		});
    	}
     
    	setMarker() {
    		var manager = Object.create(MarkerManager);     // Creation objet avec MarkerManager prototype
     
            ajaxGet(this.url, function (reply) {
                var locations = JSON.parse(reply);          // Creation array avec la réponse de l'API
                locations.forEach(function (location) {      // For each "location" de l'array "locations"
                    manager.add(location);                 // Creation d'un nouveau marqueur
                //manager.showDetails(location);        // Montrer les détails du marqueur au clic
                });
                manager.pushMarker();                       // Creation du MarkerClusterer
            });
    	}
    }
     
    var createMap = new MapCreator('https://api.jcdecaux.com/vls/v1/stations?contract=Lyon&apiKey=67c4688df481c3a0da62ebfb2eb8619cca1a3542');

  20. #20
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Points : 2 006
    Points
    2 006
    Billets dans le blog
    1
    Par défaut
    Il y a vraiment une forme d'ego disproportionné et réfractaire aux changements chez les développeurs JS en fait.

    "NON, on ne veut pas que JavaScript ait des classes, du typage et ressemble à n'importe quel langage normal. On veut que ça reste tordu et qu'il faille un long apprentissage pour maîtriser ses particularités (absurdités ?) pour pour pouvoir continuer à dire aux autres développeurs qu'ils n'ont rien compris !"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [POO] Convertir un XML en String
    Par Tchupacabra dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/09/2008, 14h10
  2. [POO] Convertir un objet
    Par cuber dans le forum Langage
    Réponses: 5
    Dernier message: 30/12/2007, 01h00
  3. [POO] Convertir un objet en tableau
    Par jbaudin dans le forum Langage
    Réponses: 3
    Dernier message: 22/03/2006, 16h50
  4. Réponses: 4
    Dernier message: 06/06/2004, 12h07
  5. convertir un nom long (win32) en format dos (8+3)
    Par kylekiller dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2002, 13h34

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