Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction call()

comment ça marche ?

Sujet résolu
    9 juillet 2009 à 15:02:59

    Bonjour, j'ai fait une class qui contient un objet quelconque. Ce que j'aimerais faire c'est que quand on veut appeler un fonction de cet objet on fasse pas
    maClass.objet.Fonction()
    
    mais
    maClass.Fonction()
    
    (en gros je veut supprimer l'intermédiaire ;) ). Je crois que pour cela on peut utiliser la fonction call() mais je ne vois pas du tout comment elle peut fonctionner (même avec un tuto je ne comprend toujours pas).
    J'ai fait ceci :
    function maClass(str)
    {
    	var objet = this.CreateObject(str);
    	objet.call(this);
    }
    

    Mais bon bien sur ça ne marche pas :(
    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      9 juillet 2009 à 15:05:20

      Citation : nod_

      Il n'y a pas de class en JS !




      Edit: Ah non, j'ai mal compris le problème je crois :)
      • Partager sur Facebook
      • Partager sur Twitter
        9 juillet 2009 à 15:09:18

        Oui je sais je pourrai redéfinir toutes le fonctions mais l'objet en question est un element html et donc il y a énormément de méthodes et d'attributs à redéfinir :euh: Surtout que je ne les connais pas tous

        Et oui en effet il n'y a pas de class en JS (d'ailleurs c'est vraiment bête, il aurait pu être bien ce language :p ) mais bon ça y ressemble
        • Partager sur Facebook
        • Partager sur Twitter
          9 juillet 2009 à 15:12:51

          Désolé j'avais mal lu ce que tu voulais (C'est une habitude en ce moment, je veux aller trop vite >_>) ^^

          Personnellement je ferais un truc du style:

          function maClass(str) {
          	for (var i in str) {
          		if (str.hasOwnProperty(i)) {
          			this[i] = str[i];
          		}
          	}
          }
          


          Après je pense qu'il doit y avoir plus court, je vais voir à droite à gauche :)


          Edit: Correction du hasOwnProperty, il fallait i et non pas str[i]
          • Partager sur Facebook
          • Partager sur Twitter
            9 juillet 2009 à 16:11:17

            Bon après recherche je me suis rendu compte que call() (ou apply() ) ne correspondent pas du tout à ce que je veux.
            Ta solution Tiller fonctionne (après l'avoir légèrement modifié : str.hasOwnProperty(i) en this.objet.hasOwnProperty(i) et this[i] en this.objet[i]) mais cela ne correspond pas exactement à ce que je voulais, par contre merci parce que ça m'a permis de régler un autre problème ^^:lol:
            Sinon je pense que je peux me débrouiller autrement, enfin si quelqu'un à la solution je suis preneur :)
            • Partager sur Facebook
            • Partager sur Twitter
              9 juillet 2009 à 16:36:38

              J'ai pas très bien compris alors ce que tu voulais oO
              • Partager sur Facebook
              • Partager sur Twitter
                9 juillet 2009 à 17:03:22

                Ben ce que je veux c'est que quand on fasse :
                var lien = new maClass('a'); // ceci marche déjà
                lien.onmouseover = function() {}; // par exemple
                

                Et bien ça fasse en réalité ceci :
                var lien = new maClass('a');
                lien.objet.onmouseover = function() {};
                

                En gros c'est juste pour raccourcir le code
                Je ne sais pas si c'est possible mais je pense que oui.
                Une possibilité serait que si on appelle une méthode qui ne fait pas partie de la class, cela appelle une méthode de l'objet je ne sais pas si on peut ; en php on pourrai faire comme ceci :
                <?php
                class maClass
                {
                    $objet; // une variable qui contient l'objet
                
                //---- ici le constructeurs et toutes les méthodes
                    function __call($method, $args) // si une fonction ne fesant pas partie de la class est appelée
                    {
                	$this->objet->$method($args); // on appelle la fonction de l'objet
                    }
                }
                ?>
                

                Voila pourquoi je pensait que la fonction call() pouvait résoudre mon problème
                • Partager sur Facebook
                • Partager sur Twitter
                  9 juillet 2009 à 17:19:28

                  Ah ouai, dans ce cas tu t'attaques carrément ;o

                  Huuum :euh:

                  Essaie:

                  function maClass(str) {
                  	//...
                  	this.prototype = this.object;
                  }
                  


                  Je suis pas sur du tout que ça marchera, ça m'étonnerais même en fait
                  xD
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 juillet 2009 à 17:39:46

                    Hélas tu as raison ça ne marche pas :lol:
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 juillet 2009 à 17:55:21

                      ou sinon:
                      var lien = new maClass('a');
                      var obj = lien.object;
                      obj.onmouseover = function() {};
                      


                      ça fait juste un ligne en plus dans le code source quand tu voudras prendre le raccourci.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 juillet 2009 à 18:16:34

                        C'est sur mais ce que je voudrais serais de le faire dans la class et non en dehors (je sais je suis chiant :p )
                        Mais de toute façon c'est bon, en redéfinissant certaines fonctions je peux les rendre bien plus puissantes et pratiques : un ptit exemple juste pour les yeux ^^ :
                        var lien = new HTML('a');
                        
                        lien.style({
                        	color  : 'grey',
                        	cursor : 'pointer'
                        });
                        
                        lien.event({
                        	onmouseover : function() {
                        			lien.style({
                        				background : '#e8e8e8'
                        			});
                        		},
                        	onmouseout : function() {
                        			lien.style({
                        				background : 'white'
                        			});
                        		}
                        });
                        

                        Sympa non ? :p
                        Merci encore à Tiller qui ma donné cette idée
                        Voila mon problème est donc résolu
                        (sauf si quelqu'un sait comment faire la technique de Darkodam à partir de la class)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Fonction call()

                        × 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