2015-11-23 4 views
22

Я работаю с небольшими фрагментами JavaScript в течение 3 лет, но теперь я создаю приложение React, и я вхожу в него. Есть основная вещь, которую я не понимаю. React использует диспетчер и хранилища для создания своего шаблона потока, то, что я не получаю, заключается в том, что этот диспетчер отображается во всем приложении, потому что действия используют диспетчер для отправки действий и хранения регистра в диспетчер для получения уведомления (так это не новый диспетчер каждый раз). Итак, как я могу достичь этого «глобального» масштаба или как он называется? Как это можно достичь с помощью классов ES6 (модулей)?JavaScript и ES6, «глобальные» переменные

Этот вопрос может быть неясным из-за моего отсутствия опыта программирования реального JavaScript, я надеюсь, что с помощью комментариев сообщества я смогу это устроить.

ответ

42

Вы всегда можете назначать переменные window.MyClass = whatever (global.MyClass для nodejs) независимо от того, где вы находитесь, и получать доступ к этим значениям из любого другого файла приложения. Однако это не всегда лучший способ совместного использования данных в глобальном масштабе в вашем приложении. Загрузчик модуля в nodejs (или AMD в ES6) берет все, что вы экспортируете и кэширует. Допустим, у вас есть файл, как:

MyModule.js:

class MyClass { 
    constructor() { 
    this.someData = 55; 
    } 
} 

export default (new MyClass); 

Теперь, когда мы требуем этот файл в другом месте, мы всегда уделяемое одного экземпляра MyClass. Это означает:

file1.js:

import MyClass from './MyModule' 
MyClass.someData = 100; 

file2.js:

import MyClass from './MyModule' 
console.log(MyClass.someData); 

Это называется одноплодной шаблон, где мы огибают один общий экземпляр вашего класса все в вашем приложении , Таким образом, таким образом мы можем получить доступ к тому же экземпляру MyClass из разных файлов, без загрязнения глобальной области (мы избегаем назначений global.MyClass, но выполняем те же функции).

+0

Отлично, я экспортировал свои классы как '' 'экспорта по умолчанию MyClassName''' – vicaba

+1

@vicaba для еще большего контекста, шаблон I Выше выражено выше, называется singleton pattern ^, где вы передаете один общий экземпляр вашего класса в своем проекте. – Macmee

+0

Я знаю, но я не был уверен, что в JavaScript вызывается то же самое, спасибо еще раз :) – vicaba

6

Что вы ищете, это создать синглтон. От 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; 
 
    } 
 
}

Я испытал это, и она работает. Вы просто замените this.time = new Date() на this.singletonFunction = function() {}. Где вы хотите использовать это сделать свой импорт то

let aSingleton = (new importName()).singletonFunction;

Смежные вопросы