Javascript: Module Pattern vs constructeur / Prototype pattern?

je voudrais savoir si le modèle de module ou le modèle de constructeur/protoType est plus applicable à mon travail.

fondamentalement, j'utilise javascript discret -- le document HTML a une référence à la .fichier js.

ma compréhension du modèle de module:

  • de l'appel d'une méthode INIT (qui est en fait une méthode publique, je peux créer et de retour en utilisant le motif de module)
  • dans L'INIT méthode, assigner tous les événements de clic etc.

cela ressemble au modèle parfait pour ma situation, car je n'ai pas besoin de créer des objets et des hiérarchies d'héritage, etc.

ma compréhension du modèle constructeur / Prototype:

  • pour la création d'objets
  • pour l'utilisation de l'héritage (c'est à dire les sous-types d'un supertype)

suis-je correct, que pour fournir javascript discret, le motif du module est idéal?

71
demandé sur ataddeini 2010-09-25 00:54:35

4 réponses

Constructeur-les fonctions et les prototypes sont l'une des façons raisonnables pour mettre en œuvre les classes et les instances. Ils ne correspondent pas tout à fait à ce modèle, donc vous avez généralement besoin de choisir un schéma particulier ou une méthode d'assistant pour mettre en œuvre des classes en termes de prototypes. ( un peu de fond sur les classes en JS .)

le modèle de module est typiquement utilisé pour l'espace de noms, où vous aurez une seule instance agissant comme un magasin pour grouper les fonctions liées et les objets. C'est un cas d'utilisation différent de ce pour quoi le prototypage est bon. Ils ne sont pas vraiment en concurrence les uns avec les autres; vous pouvez tout à fait utiliser les deux ensemble (par exemple mettre un constructeur-fonction à l'intérieur d'un module et dire new MyNamespace.MyModule.MyClass(arguments) ).

66
répondu bobince 2017-05-23 11:47:14

modèle de Module est de loin plus facile et plus élégant que prototype. Cependant, penser mobile d'abord. Ce n'est pas un modèle pertinent pour les objets de taille moyenne ou grande car l'initialisation doit analyser le bloc entier avant de commencer. Les fermetures multiples créent aussi des dépendances circulaires que le collecteur de déchets ne libère pas (surtout IE), il en résulte une empreinte mémoire plus lourde non libérée jusqu'à ce que la fenêtre (ou l'onglet) est fermée - consultez le Gestionnaire des tâches chrome pour comparer- Le temps de chargement est inversement proportionnelle à la taille de l'objet en utilisant le motif du module alors que ce n'est pas le cas pour l'hérédité prototypique. Les énoncés ci-dessus sont vérifiés au moyen de plusieurs points de repère comme celui-ci: http://jsperf.com/prototypal-performance/54

Comme on le voit dans le dernier test. Il est préférable d'initialiser les petits objets en tant qu'objet simple ( sans ces motifs). Il est adapté pour les objets simples ne nécessitant pas de fermeture ni d'héritage. Il est préférable d'évaluer si vous avez besoin même de ces modèles.

11
répondu Yann VR 2012-12-03 17:04:42

vous pouvez essayer le motif pliant, voici un lien: Motif De Pliage Javascript

j'ai laissé une réponse à une question similaire, qui montre comment utiliser le Schéma de Pliage:

exemple Simple de schéma de pliage

5
répondu intrepidis 2017-05-23 12:02:38

Prototype pattern nous aide à étendre la fonctionnalité et il n'y a qu'une seule instance de fonctions dans une mémoire quel que soit le nombre d'objets. Dans Module patter, chaque objet crée une nouvelle instance de fonctions en mémoire, mais il fournit le concept de variables privées/publiques et aide à encapsuler les variables et les fonctions.

4
répondu user1662008 2014-07-16 18:16:59