8
votes

Quand utiliser ceci dans JavaScript OO?

en JavaScript oo, quand dois-je utiliser le mot-clé code> code> aussi, si je veux appeler une méthode d'une classe d'une autre méthode de la même classe, dois-je utiliser Ce code> ou juste le nom de la fonction? E.g est-ce correct? P>

function Foo()
{
   this.bar= function()
   {
      alert('bar');
   }

   this.baz= function()
   {
     this.bar(); //should I use this.bar() or just bar()?
   }
}


3 commentaires

Vous ne pouvez pas utiliser juste bar () car ceci n'est jamais implicite dans JavaScript (puisque ce n'est pas vraiment une langue appropriée orientée objet.) bar () Chercher d'abord une variable définie comme bar dans la fonction this.baz , il rechercherait une variable définie comme bar dans le Fonction foo et enfin, il examinerait la portée globale et échoué à une erreur.


Il est important d'apprendre le système de prototype JavaScript, donc c'est une excellente question à poser. Mais si j'allais faire un grand programme OO en JavaScript, j'utiliserais Joose.Js ou Js.Class.


Certaines trolls de la Downvote qui votent si elles ne sont pas d'accord ou de penser stupide, ce qui ne va pas par le S.o. Définition du bowvote = \


6 Réponses :


0
votes

Dans cet exemple particulier, il est préférable d'utiliser une variable d'auto-référencement à la place de ceci code> pour éviter les fonctions de confusion et de maux de tête.

function Foo()
{
   var self = this;

   this.bar= function()
   {
      alert('bar');
   }

   this.baz= function()
   {
     self.bar();
   }
}


4 commentaires

Vous le faites pour que la portée est évidente. Beaucoup de gens utilisent "ça" au lieu de "soi".


Notez que, en le faisant, vous supprimez la possibilité de reculer la fonction, c'est-à-dire fooinstance.baz.call (barinstance);


@ TJ111: Vous avez dit: "Dans votre exemple, l'appel à cela.bar () fait référence à foo.baz.bar, pas foo.bar". Ce n'est pas vrai. Si vous créez une instance de FOO et appelez Baz, le contexte de Baz est votre instance FOO. Vérifiez-le: JSBIN.com/onida/edit


Vous avez certainement besoin de la référence d'auto-référence dans des fonctions imbriquées ou lorsque la fonction sera appelée dans un contexte différent - des gestionnaires d'événements et des appels différés, par exemple. J'essaie d'éviter de l'utiliser dans le monde entier.



0
votes

Juste pour souligner et empathiser la réponse précédente de @ TJ111 Je vous suggère de lire Ce . Mieux comprendre la fonction de fonction.


0 commentaires

6
votes

Quand il s'agit de "orienté objet" JavaScript, voici une belle marque de guide Dickinson ici sur tellement liée à: Membres privés à Javascript . Il passe dans des détails sur d'autres choses dont vous n'avez pas vraiment besoin maintenant, mais une fois que vous comprenez comment JavaScript fonctionne, vous verrez que c'est très différent de votre langue habituelle orientée objet lorsqu'il s'agit de choses comme ce que Ce signifie vraiment.

Je dirais que dans votre cas, vous devez absolument utiliser ceci , mais peut-être que vos fonctions doivent figurer dans le prototype de votre "classe" (cela évite redéfinir la fonction chaque fois qu'une nouvelle instance est créée.)


3 commentaires

J'ai fait un simple modèle pour les cours qui semble être très similaire à ce que Douglas Crawford a dans son article (que je suis lié.) Si vous envisagez du code aide, vous pouvez toujours regarder cela: blixt.org/js/classes.js (fichier brut) Blixt.org/js#project/js-classes (avec la syntaxe)


Qu'entendez-vous par la «partie prototype de la classe»?


Les fonctions ont un prototype Propriété utilisée comme prototype pour les objets créés lors de l'appelant la fonction avec le mot clé nouveau . Si vous définissez foo.pototype.bar = fonction () {...}; , alors tous les objets créés avec nouveau foo () aura une barre / Code> Propriété qui fait référence à la fonction foo.pototype.bar .



0
votes

La version correcte est celle qui ne donne pas une erreur lorsque vous essayez d'appeler la fonction. Si vous omettez Ceci Vous obtiendrez un RéférenceError Exception.


0 commentaires

1
votes

0 commentaires

0
votes

Dans un autre message sur "Fonction Aliasing" dans JavaScript, j'ai expliqué en détail, avec des exemples, comment "cela" fonctionne dans JavaScript. Je pense que cela peut vous être utile.

Veuillez vérifier: Fonction JavaScript Aliasing ne semble pas travail


0 commentaires