javascript - logo - react js vs angular
JavaScript y ES6, variables “globales” (2)
He estado trabajando con pequeños fragmentos de JavaScript durante 3 años, pero ahora estoy creando una aplicación React y me estoy metiendo en ella. Hay una cosa básica que no entiendo. React usa un Dispatcher y Stores para construir su patrón de Flux, lo que no entiendo es que este Dispatcher es visible en todas las aplicaciones, porque las Acciones usan el Dispatcher para enviar acciones y las Tiendas se registran al Dispatcher para recibir notificaciones no es un nuevo Dispatcher cada vez). Entonces, ¿cómo puedo lograr este alcance "global" o como se llame? ¿Cómo se puede lograr esto usando clases ES6 (módulos)?
Esta pregunta puede no ser clara debido a mi falta de experiencia en la programación de JavaScript real, espero que con la ayuda de los comentarios de la comunidad pueda arreglar eso.
Lo que estás buscando es crear un singleton. De http://amanvirk.me/singleton-classes-in-es6/ .
let instance = null;
export default class Cache{
constructor() {
if (!instance) { instance = this; }
this.time = new Date()
return instance;
}
}
He probado esto y funciona. Simplemente reemplazaría this.time = new Date () con this.singletonFunction = function () {}. Donde quieras usarlo haz tu importación entonces
let aSingleton = (new importName()).singletonFunction;
Siempre puede asignar variables a window.MyClass = whatever
( global.MyClass
para nodejs) sin importar dónde se encuentre, y acceder a estos valores desde cualquier otro archivo en su aplicación. Sin embargo, esa no es siempre la mejor manera de compartir datos globalmente en su aplicación. El cargador de módulos en nodejs (o AMD en ES6) toma todo lo que exporta y lo almacena en caché. Digamos que tienes un archivo como:
MyModule.js:
class MyClass {
constructor() {
this.someData = 55;
}
}
export default (new MyClass);
Ahora, siempre que necesitemos este archivo de otro lado, SIEMPRE se nos da la MISMA instancia de MyClass
. Esto significa:
file1.js:
import MyClass from ''./MyModule''
MyClass.someData = 100;
archivo2.js:
import MyClass from ''./MyModule''
console.log(MyClass.someData);
Esto se denomina patrón de singleton, donde transmitimos una instancia común de su clase a lo largo de toda su aplicación. De esta manera, podemos acceder a la misma instancia de MyClass
desde diferentes archivos, todo sin contaminar el alcance global (evitamos hacer asignaciones a global.MyClass
pero logramos la misma funcionalidad).