web-dev-qa-db-fra.com

Javascript: modèle de module vs modèle de constructeur / prototype?

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

Fondamentalement, j'utilise javascript discret - le document HTML a une référence au fichier .js.

Ma compréhension du modèle de module:

  • appeler une INIT (qui est fondamentalement une méthode publique que je peux créer et retourner en utilisant le modèle de module)
  • Dans la méthode INIT, attribuez 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 créer des objets
  • pour utiliser l'héritage (c'est-à-dire les sous-types d'un supertype)

Ai-je raison de dire que pour fournir un javascript discret, le modèle de module est idéal?

73
Martin

Les fonctions constructeurs et les prototypes sont l'un des moyens raisonnables d'implémenter des classes et des instances. Ils ne correspondent pas tout à fait à ce modèle, vous devez donc généralement choisir un schéma particulier ou une méthode d'assistance pour implémenter des classes en termes de prototypes. ( Quelques informations sur les classes en JS .)

Le modèle de module est généralement utilisé pour l'espace de noms, où vous aurez une seule instance agissant comme un magasin pour regrouper les fonctions et les objets liés. Il s'agit d'un cas d'utilisation différent de celui pour lequel le prototypage est bon. Ils ne sont pas vraiment en concurrence les uns avec les autres; vous pouvez très bien utiliser les deux ensemble (par exemple, mettre une fonction constructeur dans un module et dire new MyNamespace.MyModule.MyClass(arguments)).

68
bobince

Le modèle de module est de loin plus facile et plus élégant que le prototype. Cependant, penser d'abord au mobile. Ce n'est pas un modèle pertinent pour les objets de taille moyenne/grande car l'initialisation doit analyser l'ensemble du bloc avant de démarrer. Les fermetures multiples créent également des dépendances circulaires que le garbage collector ne libère pas (en particulier IE), il en résulte une empreinte mémoire plus lourde non libérée jusqu'à ce que la fenêtre (ou l'onglet) soit fermée - vérifiez chrome tâche gestionnaire à comparer - Le temps de chargement est inversement proportionnel à la taille de l'objet en utilisant le modèle de module alors que ce n'est pas le cas pour l'héritage prototypique. Les déclarations ci-dessus sont vérifiées à travers plusieurs tests de référence comme celui-ci: http://jsperf.com/ performances prototypiques/54

Comme vu lors du dernier test. Il vaut mieux initialiser les petits objets en tant qu'objets simples (sans ces motifs). Il convient aux objets uniques ne nécessitant ni fermeture ni héritage. Il est sage d'évaluer si vous avez même besoin de ces modèles.

12
Yann VR

Vous pouvez essayer le modèle de pliage, voici un lien: modèle de pliage Javascript

J'ai également laissé une réponse à une question similaire, qui montre comment utiliser le modèle de pliage:

Exemple simple de motif pliant

5
intrepidis

Le modèle de prototype 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 un concept de variables privées/publiques et aide à encapsuler les variables et les fonctions.

4
user1662008