Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utilisation d'une fonction dans le constructeur d'un objet

Sujet résolu
    30 août 2010 à 13:56:06

    Bonjour,

    je chercher un moyen d'utiliser la fonction var.replace(); dans un constructeur que j'ai codé, mais j'ai une erreur, il considère replace() comme une méthode (non défini) du constructeur tableau2D, voici mon code :

    function tableau2D(data)
    	{
    		this.taille = 201;
    		this.haut = 200;
    		this.grille = new Array();
    		
    			var t = 0;	
    			
    		for(var j=0; j<this.taille; j++)
    			this.grille[j] = new Array();
    			
    		for(var i=0; i<this.taille; i++)
    		{
    			for(var k=0; k<this.taille; k++)
    			{
    				var content = data[t];
    				content = content.replace(/^11$/g, '<img src="tpl/includes/images/cinqa.png" />');
    				content = content.replace(/^21$/g, '<img src="tpl/includes/images/cinq-vinghta.png" />');
    				content = content.replace(/^31$/g, '<img src="tpl/includes/images/vinght-Infinitya.png" />');
    				content = content.replace(/^41$/g, '<img src="tpl/includes/images/ConvotedRa.png" />');
    				content = content.replace(/^51$/g, '<img src="tpl/includes/images/noConvotedRa.png" />');
    				content = content.replace(/^0$/g, '<img src="tpl/includes/images/vide.png" />');	
    				content = content.replace(/^1$/g, '<img src="tpl/includes/images/cinq.png" />');
    				content = content.replace(/^2$/g, '<img src="tpl/includes/images/cinq-vinght.png" />');
    				content = content.replace(/^3$/g, '<img src="tpl/includes/images/vinght-Infinity.png" />');
    				content = content.replace(/^4$/g, '<img src="tpl/includes/images/covetedR.png" />');
    				content = content.replace(/^5$/g, '<img src="tpl/includes/images/noConvotedR.png" />');
    
    				this.grille[i][k] = content;
    				t++
    			}
    		}
    	}
    


    J'ai réduis la taille du tableau à 200x200 environ car sinon à 800x800 j'avais un bon plantage :D

    Ma question : comment faire en sorte que replace ne soit pas considéré comme la méthode de tableau 2D ?

    Merci par avance pour vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      1 septembre 2010 à 14:44:15

      Mon seul UP, j'ai vraiment besoin de savoir comment utiliser replace() !!

      Merci par avance pour vos réponses.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        1 septembre 2010 à 22:43:24

        Donne l'erreur exacte. Ensuite, replace(/^11$/g, '<img src="tpl/includes/images/cinqa.png" />') est inutilement lourd étant donné qu'il peut être remplacé par replace('11', '<img src="tpl/includes/images/cinqa.png" />') .
        • Partager sur Facebook
        • Partager sur Twitter
          2 septembre 2010 à 10:41:18

          Ce qui est inutilement lourd c'est les 11 regexp d'affilée dans lesquelles, par construction, une seule s'exécutera... Surtout si c'est pour tester globalement (tag g) que la chaine commence et fini par un nombre particulier... Niveau lourdeur on atteint des sommet...

          Bref! Je suppute que l'erreur provient du fait que son tableau ne contient que des nombres et que l'erreur provient du fait que replace ne fait pas parti des méthodes des nombres mais des chaines de caractères.

          Pour ce genre de cas, des gens ingénieux ont inventé les conditions if/else et le switch, ce dernier me semblant plus adapté.

          switch(content) {
              case 11:
                  content = '<img src="tpl/includes/images/cinqa.png" />';
                  break;
              case 21:
                  content = '<img src="tpl/includes/images/cinq-vinghta.png" />';
                  break;
              // etc...
          }
          


          Voire même pour faire plus court, la création d'un tableau avec les images à changer :
          var imgs = [];
          imgs[11] = '<img src="tpl/includes/images/cinqa.png" />';
          imgs[21] = '<img src="tpl/includes/images/cinq-vinghta.png" />';
          


          puis dans la boucle :
          if(imgs[content])
              content = imgs[content];
          
          /*
          ou plus court :
          content = imgs[content] || content;
          */
          
          • Partager sur Facebook
          • Partager sur Twitter
            2 septembre 2010 à 11:10:57

            Bonjour,

            et merci à vous deux pour vos réponses, c'est vrai que je n'ai pas vraiment pensé à des conditions pour remplacer le contenu du tableau, et c'est sur que ça marche mieux, merci Darkodam !

            Berdes1 -> Qu'est ce que cela change exactement le fait de mettre /^11$/g au lieu de '11' dans le cas où ça revient au même ?
            je ne suis pas sur d'avoir tout compris ...;

            Enfin, pour le jour où j'aurais vraiment besoin d'utiliser replace() et qu'aucune autre fonction ou autre ne peux le faire, comment faire ?

            L'erreur donnée était :

            Citation

            Uncaught TypeError: Object 0 has no method 'replace'
            tableau2D/project/tpl/includes/tableau2D.js:49
            (anonymous function)

            Uncaught TypeError: Cannot call method 'innerHTMLDocument' of undefined
            (anonymous function)



            Cela entrainait donc aussi l'erreur de la methode que j'ai crée innerHTMLDocument (j'ai pas trouvé mieux comme nom).

            Je marque quand même en résolu bien que le problème de la fonction replace me bloquera peut être (ou pas) plus tard :s

            Merci en tous les cas pour vos réponses;
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              2 septembre 2010 à 11:41:16

              Et bien, ton erreur est du au fait que content est un nombre et que replace est une méthode de l'objet string, ce qui pose problème.
              Ensuite, la différence entre /^11$/g et '11' est que le premier est une regex et que le deuxième est une chaine de caractère. Dans le premier cas, le javascript devra démarrer le moteur de regex, analyser la regex et vérifier que la chaine correspond à la regex. Dans le deuxième cas, replace va juste chercher la chaine 11 et la remplacer quand il la trouvera. Avoue que c'est plus simple.
              • Partager sur Facebook
              • Partager sur Twitter
                2 septembre 2010 à 11:54:36

                Citation : keke21410

                Qu'est ce que cela change exactement le fait de mettre /^11$/g au lieu de '11' dans le cas où ça revient au même ?



                En fait ça ne revient pas au même car en fournissant une chaine de caractère à replace, la fonction remplacera la 1ère occurrence de cette chaine dans la chaine de départ.
                "test test test".replace('test', 'plop'); // = "plop test test"
                "test test test".replace(/test/, 'plop'); // = "plop test test"
                "test test test".replace(/test/g, 'plop'); // = "plop plop plop" (l'ajout du tag g rend la regexp globale)
                

                plus d'infos:
                [MDC] RegExp (anglophobe)
                [MDC] replace (anglophobe)

                Mais en mettant ça de coté, la différence entre /^11$/g et '11' se trouve dans la puissance de calcul et la mémoire nécessaire à la création et l'utilisation de ces deux entités. Du à sa complexité, une regexp demandera plus de puissance de calcul et de mémoire qu'une simple de chaine de caractère.
                Dans l'utilisation que tu veux en faire (à l'origine, une boucle de 800x800 = 640000), le moindre gain de performance et de mémoire est bon à prendre ;) .
                • Partager sur Facebook
                • Partager sur Twitter
                  12 septembre 2010 à 11:08:35

                  En effet, je comprend un mieux le principe des regex.

                  Merci à vous deux pour vos réponses.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Utilisation d'une fonction dans le constructeur d'un objet

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown