¿Cuál es el patrón del módulo en JavaScript?

El objetivo del patrón del módulo es modularizar el código.

Hay varias formas de modularizar código en JavaScript como:

  • Usando objetos literales.
  • El patrón del módulo.
  • Patrón de módulo revelador
  • y tantos otros ..

Usando la notación literal del objeto.

  var objLiteral = {
         nombre: "John Snow",
         trabajo: función myWork () {
                console.log ('¿quién hace del mundo un lugar mejor para vivir? La respuesta es' + this.name); 
        }
 }

 objLiteral.name;  // salidas "John Snow"
 objLiteral.work;  // produce "¿quién hace del mundo un lugar mejor para vivir? La respuesta es John Snow"

Usar patrón de módulo

  var myModule = (function () {
         var privVar = "John Snow";
         regreso {
                 "whatsMyName": privVar,
                 "howIsDay": function () {console.log ("¡es bueno!");  }
         }
 }) ();

 myModule.whatsMyName;  // salidas "John Snow"
 myModule.privVar;  // Esto no funcionará ya que privVar solo está disponible dentro del alcance de myModule y no fuera de él, ya que no se devuelve.

Cosas a tener en cuenta en el patrón del módulo:

  • El patrón de módulo encapsula propiedades privadas mediante cierres.
  • El patrón es similar a IIFE (expresión de función invocada inmediatamente), excepto que se devuelve un objeto y no una función.
  • En JavaScript no existe el concepto de modificadores de acceso como público, privado, paquete, protegido. JavaScript solo tiene un alcance de variables, es decir, el alcance de la función. Entonces, tenemos que usar la función para simular el concepto del patrón del módulo OOP.
  • Solo exponemos funciones y propiedades a las que queremos que tenga acceso el resto del código. El resto es privado dentro del cierre.

Patrón de módulo revelador

  var rmp = function () {

         var privVar = "John Snow";

         función fun1 () {
                 console.log ('Es un hermoso día');
         }

         función fun2 () {
                console.log ('¿Ves Game of Thrones?');
        }
    
        función fun3 () {
                 console.log ('Harry Potter es increíble');
         }

         regreso {
                api1: fun1,
                api2: fun2
         }
 } ();

Cosas a tener en cuenta en el patrón de módulo revelador:

  • El objeto devuelto es un objeto sin definición de función. Todas las expresiones del lado derecho en la declaración de retorno son variables de cierre.
  • El objeto de devolución decide qué se expone como API y qué se mantiene como propiedad privada. fun1 está disponible a través de rmp.api1, fun2 está disponible a través de rmp.api2 y fun3 no está disponible en el código de código anterior fuera de rmp.
  • Tenga cuidado con el patrón Revealing Design si está diseñando una API que se utilizará fuera de su equipo. Si desea anular la definición de rmp.api1, no puede hacerlo, ya que rmp.api1 es una referencia a fun1, que es una propiedad privada de rmp. Por lo tanto, no hay forma de anular rmp.api1. Esto se considera un anti patrón.

Para más información, consulte:

  • Patrones JavaScript de Stoyan Stefanov
  • Aprendizaje de patrones de diseño de JavaScript por Addy Osmani

Aquí se puede encontrar una publicación bastante conocida sobre el patrón de módulo (en Javascript):
http://www.yuiblog.com/blog/2007

El patrón de módulo simplemente usa una función anónima para crear variables públicas y privadas, de esta manera:

// Assign the return of an Immediately Invoked Function var myModule = (function() { // Variables are defined in local scope without using `this` var myPrivateName = 'Eric'; // Functions are in local scope as well var lowerCaseMyPrivateName = function() { return myPrivateName.toLowerCase(); }; // All public methods are made accessible through the `return` statement return { name: myPrivateName, gender: 'Male', lowerCaseName: lowerCaseMyPrivateName }; })(); console.log(myModule.name); // Eric console.log(myModule.gender); // Male console.log(myModule.lowerCaseName()); // eric 

Para crear código reutilizable o crear una biblioteca común, que expone las funciones a otros componentes.

Es similar a los ayudantes comunes de Java, clases de utilidad que tienen métodos genéricos y se referirá a todas las partes del programa. Entonces, en lugar de escribir código repetitivo en todos los archivos, mantenemos en esos ayudantes comunes.

Del mismo modo, podemos hacer lo mismo en javascript por módulos. En su archivo javascript, debe exportar los módulos donde desea que las funciones específicas se expongan, como se muestra a continuación.

  var addNumbers = function (a, b) {
	 devuelve a + b;
 }

 export.modules = {addNumbers};

¡Así es como se siguen todas las bibliotecas y módulos en módulos de nodo en javascript!