27 votes

Quoi de neuf avec ce modèle JavaScript?

J'ai vu ce schéma:

 Money = (function() {
    function Money(rawString) {
        this.cents = this.parseCents(rawString);
    }
});
 

dans cet aperçu de la capture d'écran de CoffeeScript . (La page d'accueil du screencast est ici .)

Maintenant, je ne comprends pas ce schéma. Il existe une fonction Money qui contient une fonction Money . Ça parles de quoi?

Quelqu'un pourrait-il expliquer?

17voto

T.J. Crowder Points 285826

Comme indiqué, il n'y a pas de point de motif autre que celle de l'extérieur Money symbole peut être supprimé de l' window objet (sauf sur IE7 et ci-dessous, mais c'est une autre histoire) parce que c'est un normal (implicite) de la propriété de l' window (par opposition à un var ou un symbole découlant d'une déclaration de fonction). Mais même alors, le externe Money symbole reçoit une fonction qui ne fait absolument rien. Pourrait-il être mal cité?

Par exemple, voici un assez standard avec patrons:

Money = (function() {
    var someCompletelyPrivateVariable;

    function doSomethingCompletelyPrivate() {
    }

    function Money(rawString) {
        this.cents = this.parseCents(rawString);
    }

    return Money;
})();

C'est le motif de module, et il vous permet d'avoir complètement privé des variables et des fonctions (à la fois illustré) tout en ayant seulement un symbole public. Mais j'ai dû modifier un peu juste de le créer (la plus importante des modifications en cours de l' return Money; à la fin et l'ajout d' () après la fonction anonyme, nous sommes donc d'appeler plutôt que de simplement la définir.

15voto

RightSaidFred Points 7276

À l'aide de la CoffeeScript code que la vidéo réclamations est une conversion correcte...

class Money
    constructor: (rawString) ->
        @cents = @parseCents rawString

...CoffeeScript va générer le suivant, qui est essentiellement identique à @T. J. Crowder réponse:

var Money;
Money = (function() {
  function Money(rawString) {
    this.cents = this.parseCents(rawString);
  }
  return Money;
})();

Je suis en train de poster ce pour montrer ce que CoffeeScript en fait , et que la vidéo ne représente pas la réalité.

Vous pouvez voir la conversion si vous visitez le site et cliquez sur "Essayez CoffeeScript" bouton.

S'il vous plaît ne pas "accepter" cette réponse.


EDIT:

Pour ajouter un peu de privés d'utilisation variables qui utilise le champ d'application, vous pouvez faire ceci:

class Money
    priv=0
    constructor: (rawString) ->
        @cents = @parseCents rawString
        @id = priv++

...qui se traduit par:

var Money;
Money = (function() {
  var priv;
  priv = 0;
  function Money(rawString) {
    this.cents = this.parseCents(rawString);
    this.id = priv++;
  }
  return Money;
})();

En passant, je ne sais rien à propos de CoffeeScript. Sa syntaxe ressemble confus pour moi, mais peut-être juste parce que je ne suis pas habitué à ça.

J'aime le JavaScript de la façon dont il est (surtout avec le nouveau et encore à venir des changements).

4voto

Je suis l'auteur de la vidéo mentionnée, et la source de l'extrait. Quelques précisions:

  • Le contexte dans lequel l'extrait a mentionné dans une animation de la comparaison de JavaScript et CoffeeScript de la syntaxe.
  • Il a été volontairement simplifié afin de ne pas ajouter de la confusion supplémentaire dans le contexte de la CoffeeScript concept enseigné à ce moment précis dans la vidéo (la vidéo n'était pas en train d'enseigner JavaScript constructeur de classe ou de syntaxe).
  • Vous pouvez obtenir le plein JavaScript texte de toute CoffeeScript extrait de code en cours d'exécution à travers la CoffeeScript compilateur comme indiqué dans la capture d'écran vidéo, ou en l'exécutant sur le site officiel CoffeeScript site web.

Je vais ajouter une précision à la vidéo et l'extrait mentionné ci-dessus.

Sinon, l'autre ici des explications sur un Débordement de Pile sont corrects. Si vous êtes à la construction d'une classe JavaScript vous devez retourner l'objet courant et appeler la fonction anonyme indiqué ci-dessus. Mais ce n'est pas le point de CoffeeScript. ;-)

2voto

RobG Points 41170

Cela ne ressemble pas à un exemple réel, l'opérateur de regroupement de la fonction "externe" est inutile et comme le dit TJ, il ne fait absolument rien. Appelé en tant que constructeur, il renverra un objet vide.

@TJ - la citation est correcte, vous devez regarder environ 40 secondes de la vidéo.

2voto

Raynos Points 82706
 Money = (function() {
    var uid = 0;
    function Money(rawString) {
        this.cents = this.parseCents(rawString);
        this.uid = uid++;
    }
    return Money;
})();
 

Un autre cas d'utilisation de ce modèle est d'avoir des variables locales qui agissent comme si elles étaient liées statiquement à la fonction.

Ceci est subtilement différent du modèle de module car vous ajoutez des informations privées statiques à une fonction. Au lieu de regrouper les données et de renvoyer un objet qui a quelques variables locales dans la portée.

L'autre option pour y parvenir serait d'utiliser Money.uid mais ce serait public.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X