69

Me gustaría saber si el patrón del módulo o el patrón Constructor/protoType son más aplicables a mi trabajo.Javascript: patrón de módulo vs patrón de constructor/prototipo?

Básicamente estoy utilizando un javascript discreto: el documento HTML tiene una referencia al archivo .js.

Mi comprensión del patrón de módulo:

  • llamada de un método init (que es básicamente un método público que puedo crear y devolver utilizando el patrón de módulo)
  • En el método INIT, asignar todos los eventos de clic etc.

Esto suena como el modelo perfecto para mi situación, ya que no es necesario para crear objetos y las jerarquías de herencia, etc.

Mi entendimiento del patrón de Constructor/Prototipo:

  • para objetos que crean
  • para el uso de la herencia (es decir, Subtipos de un supertipo)

¿Estoy en lo correcto, que para proporcionar javascript discreto, el patrón del módulo es ideal?

Respuesta

65

Las funciones del constructor y los prototipos son una de las formas razonables de implementar clases e instancias. No se corresponden exactamente con ese modelo, por lo que normalmente debe elegir un esquema particular o un método auxiliar para implementar clases en términos de prototipos. (Some background on classes in JS.)

El patrón de módulo se utiliza generalmente para el espaciado de nombres, donde tendrá una única instancia que actúa como una tienda para agrupar funciones y objetos relacionados. Este es un caso de uso diferente de lo que es bueno para la creación de prototipos. No están realmente compitiendo entre ellos; puedes usar ambos juntos felizmente (por ejemplo, poner una función de constructor dentro de un módulo y decir new MyNamespace.MyModule.MyClass(arguments)).

+1

así que en mi caso, realmente no quiero crear instancias, por lo que el patrón del módulo es probablemente ideal para lo que quiero. Cuando dices espacios de nombres ... ¿Cómo puedo espacio de nombres en un patrón de módulo? Vi una forma de usar YUI, pero ¿es realmente necesario? – Martin

+15

No hay un truco en particular, solo usa un 'Objeto' de JavaScript como búsqueda. Cree un literal de objeto directamente como 'var MyModule = {someProperty: 3, someFunction: function() {...}, somethingElse: null};' o asigne a 'MyModule.someFunction = function() {...}; '. Si quiere variables privadas, lo hace en una expresión de función llamada inmediatamente y tiene ese 'return' como objeto en un cierre ... personalmente encuentro que las variables privadas" reales "son una completa pérdida de tiempo. – bobince

+0

Un gran consejo en general – danjah

10

El patrón del módulo es mucho más fácil y elegante que el prototipo. Sin embargo, pensando en el móvil primero. No es un patrón relevante para objetos medianos/grandes porque la inicialización necesita analizar todo el bloque antes de comenzar. Los cierres múltiples también crean dependencias circulares que el recolector de basura no libera (especialmente IE), da como resultado una huella de memoria más pesada no liberada hasta que se cierra la ventana (o pestaña) - ver el administrador de tareas de cromo para comparar- El tiempo de carga es inversamente proporcional al tamaño del objeto usando el patrón del módulo, mientras que este no es el caso para la herencia prototípica. Las afirmaciones anteriores se verifican a través de varios puntos de referencia como este: http://jsperf.com/prototypal-performance/54

Como se vio en la última prueba. Es mejor que los objetos pequeños se inicialicen como objeto simple (sin estos patrones). Es adecuado para objetos individuales que no requieren cierre ni herencia. Es aconsejable evaluar si incluso necesita estos patrones.

4

Usted puede probar con el patrón de plegamiento, aquí hay un enlace: Javascript Folding Pattern

También me dejó una respuesta a una pregunta similar, que muestra cómo utilizar el patrón de plegamiento:

Simple Example of Folding Pattern

+0

lectura muy interesante; gracias, nunca escuché hablar de este patrón. –

4

Prototipo el patrón nos ayuda a extender la funcionalidad y solo hay una instancia de funciones en una memoria, independientemente de la cantidad de objetos. En el patrón de módulos, cada objeto crea una nueva instancia de funciones en la memoria, pero proporciona el concepto de variables privadas/públicas y ayuda a encapsular las variables y funciones.

+0

¿Qué pasa con Douglas crockfords método de clase privilegiada que permite el uso de miembros privados? – wayofthefuture

Cuestiones relacionadas