Узел - Почему импортированные модули не могут получить доступ к глобальным переменным? - PullRequest
0 голосов
/ 13 июля 2020

Недавно я начал использовать ES6 и правильно разделил свой код на несколько файлов для удобства чтения и упрощения контроля версий, и я столкнулся с проблемой, которая, я не уверен, предназначена для этого, или если я что-то упускаю.

У меня есть класс, хранящийся в файле (class. js) отдельно от моего основного скрипта (main. js) и экспортированный через module.exports. В main. js требуется class. js, и я использую его для создания некоторых экземпляров класса, в котором он находится. Внутри main. js У меня есть глобальная переменная, которая регулярно обновляется, скажем, connectedPlayers. Внутри одного из моих методов класса. js У меня есть usersOnline (), который должен просто возвращать значение глобальной переменной connectedPlayers. Однако, когда я пытаюсь это сделать, я получаю сообщение об ошибке, что connectedPlayers не определен. У меня создалось впечатление, что, поскольку объект, который вызывает users.online, был определен внутри main. js, его метод usersOnline () будет искать connectedPlayers внутри main. js, а не class. js ... это правильное мышление? Если я прав в этом мнении, то почему я не могу получить доступ к connectedPlayers? Если я ошибаюсь, как я могу получить доступ к connectedPlayers изнутри моего класса?

Обратите внимание, что это все заполнители, и на самом деле у меня довольно много глобальных переменных в основном. внутри класса. js для доступа. Эти глобальные переменные также регулярно меняются, поэтому я не могу обязательно передавать их в конструктор, и я не хочу предоставлять их для каждого вызова любого метода, который я хочу использовать. Я уверен, что есть лучший способ сделать это, но как?

Чтобы еще больше уточнить, функциональность, которую я ищу, похожа на то, как JS импорт работает в браузере, однажды вы импортируете свой код, он действует так, как если бы вы объединили этот блок кода с кодом, из которого вы импортируете. Хотя я понимаю, что это не так, как это работает в node, я подумал, что определение экземпляра моего класса внутри main. js по существу вызовет методы из этого объекта (который находится в области connectedPlayers), но я думаю, что мое понимание таково. ошибочный.

Псевдо-код:

//class.js
class user{
    constructor(id){
        this.id = id;
    }

    someOtherMethod(){
        ...
    }
    
    usersOnline(){
        this.someOtherMethod(this.id); //here to show I need the context to still be the obj
        return connectedPlayers;
    }
}

//main.js
var user = require('class.js');
var players = {}
var connectedPlayers = 0;

players[id] = new user(id);
console.log(players[id].usersOnline()) //expect to return value of connectedPlayers, but also execute the other function inside of usersOnline properly.

Кроме того, в этом примере я мог просто переместить количество игроков в класс. js, но в моем реальном приложении я не мог этого сделать .

1 Ответ

1 голос
/ 13 июля 2020

Код может помочь, но, если я правильно понимаю, у вас есть псевдокод, например:

export class Class{
  constructor(){
    this.name = "foo";
  }
  usersOnline(){
   return main.connectedPlayers();
  }
}

-----

require('Class.js');

function connectedPlayers(){
  // stuff...
  return [Object]
}

...
var class1 = new Class();

console.log(class1.name); // correctly gives "foo"
console.log(class1.usersOnline()); // gives main not defined

Это потому, что class. js не имеет ссылок на основной класс. То, что объект инициализирован в main. js, не означает, что объект знает, что происходит вне его. Вам нужно сообщить Объекту при создании, в чем он состоит. Распространенный метод - передать «контекст» основного класса. (пробег может отличаться)

constructor(context){
  this.name = "foo";
  this.main = context;
}

---

var class1 = new Class(this);

Теперь при создании класс знает, на какой объект следует ссылаться, когда его просят запустить функцию usersOnline ().

Обратите внимание, что есть более элегантные способы сделать это то метод, который я перечислил, но метод, который я перечисляю, надеюсь, указывает на идею, которая обычно реализуется более элегантными способами См. этот ответ для другого метода и некоторых других ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...