Доступ к объектам из фабрик и модулей JavaScript

#javascript #module #factories

#javascript #модуль #фабрики

Вопрос:

Я пишу приложение для игры в крестики-нолики на Javascript, HTML и CSS, где я должен практиковать размещение всех своих функций внутри модулей или фабрик. В настоящее время у меня возникла проблема с доступом к объекту, созданному фабрикой, внутри других модулей.

Мой полный код можно найти здесь:https://codepen.io/wulfenn/pen/xxVqGrW

Разбивка моего кода:

У меня есть два модуля и одна фабрика; gameBoard это модуль, отвечающий за все, что связано с платой. (чтение платы, изменение платы, визуальные эффекты и т.д.)

game Модуль отвечает за функциональность (запуск новых раундов, обработка ходов игроков, проверка победителей и т.д.)

Наконец, Player это моя фабрика для создания новых игроков и имеет простую функциональность, такую как извлечение имени или получение присвоенной ему метки. (X или O)

Проблема, с которой я сталкиваюсь в настоящее время, заключается в создании проигрывателя с const p1 = Player('P1Name', 'X') внутри game модуля, в частности soloPlay() функции внутри него. Если я попытаюсь получить к нему доступ в указанной функции, у меня не возникнет проблем, но остальной код не сможет получить к нему доступ.

Если бы я должен был создать const p1 = Player('P1Name', 'X') за пределами моей фабрики и модулей, весь код мог бы получить к нему доступ. Но проблема в том, что мне нужно иметь возможность создавать новый проигрыватель в soloPlay() функции внутри game модуля.

Как я могу выполнить вызов soloPlay() и при этом иметь доступ к объектам P1 и P2 вместе с их функциями вне кода?

Спасибо за вашу помощь, и я прошу прощения, если мой код загроможден или беден, я все еще учусь.

Соответствующий код, если вы не хотите просматривать весь мой проект:

soloPlay() внутри игрового модуля.

   // Our second menu for solo play, to set the P1 name, and start the game once done.
  const soloPlay = () => {
    const enterBtn = document.querySelector('.enter-btn');
    enterBtn.addEventListener('click', function () {
      const p1 = Player(document.querySelector('.p1').textContent, 'X');
      const p2 = Player('AI', 'O');
      const soloMenu = document.querySelector('.solo-menu');
      soloMenu.style.display = 'none';
      const gameMenu = document.querySelector('.menu-bg');
      gameMenu.style.display = 'none';
      game.setup(); // Sets our grid listeners
      game.newRound(); // Starts a new round.
    });
  }
  

Фабрика плееров

 /* Our player factory in charge of creating new players, and assigning them functions to obtain their names and marks */

const Player = (name, mark) => {
  const hasTurn = true;
  const getName = () => name;
  const getMark = () => mark;

  return { getName, getMark, hasTurn };
}
  

Ответ №1:

Источник:https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/const

Объявляя переменную const, определяет ее с помощью области видимости блока, что означает, что ничто за пределами функции, которая ее создала, не сможет ее увидеть … в случае ваших игроков вы не меняете фабрику плееров, вы создаете ее экземпляр при объявлении, const p1 = Player.... поэтому p1 создается в soloPlay и недоступен для любой другой части кода … если вы объявляете p1 и p2 как глобальные (вне любой другой области или внутри области, которую вы выбираете, что имеет смысл для кода), а не объявляете их так, как const должна работать ваша игра.

 //This goes outside 'const gameBoard'
var p1;
var p2;
  

И не объявлять здесь p1 и p2 как const :

 const soloPlay = () => {
    const enterBtn = document.querySelector('.enter-btn');
    enterBtn.addEventListener('click', function () {
      p1 = Player((document.querySelector('#p1').value), 'X');
      console.log('Jugador 1: ' p1.getName());
      p2 = Player('AI', 'O');
      console.log('Jugador 2: ' p2.getName());
      const soloMenu = document.querySelector('.solo-menu');
      soloMenu.style.display = 'none';
      const gameMenu = document.querySelector('.menu-bg');
      gameMenu.style.display = 'none';
      game.setup(); // Sets our grid listeners
      game.newRound(); // Starts a new round.
    });
  }