JavaScript-модуль раскрытия состояния закрытых переменных

Недавно я начал работать над проектом JavaScript, и, исходя из мира Java, иногда это кажется странным.

Я реализовывал простой модуль (используя шаблон раскрывающегося модуля, afaik), который предоставил бы конфигурацию на основе инициализации, но заметил, что после "локальной" переменной domain назначен в init() Функция ее значение отличается в зависимости от того, доступен ли он через функцию "getter" getDomain() или напрямую через domain переменная как выставлено через модули "публичный" API.

Смотрите следующий урезанный код, который демонстрирует проблему.

var ConfigManager = (function() {

  var privateDomain = 'default';

  function init(dom) {
    privateDomain = dom;
  }

  function getDomain() {
    return privateDomain;
  }

  return {
    init: init,
    domain: privateDomain,
    getDomain: getDomain
  };

})();

console.log(ConfigManager.domain); // Prints 'default'
console.log(ConfigManager.getDomain()); // Prints 'default'

ConfigManager.init('new domain');

console.log(ConfigManager.domain); // Prints 'default' <-- What??
console.log(ConfigManager.getDomain()); // Prints 'new domain'

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

Чем ты заранее!

2 ответа

Решение

Поскольку privateDomain является строкой, вы не копируете / возвращаете ссылку, а значение.

Поэтому, когда вы меняете домен, используя init функция, она просто обновляет privateDomain, поскольку domain не имеет ссылки на него, кроме как быть копией.

Надеюсь, поможет!:)

Это потому, что когда домен возвращается, его значение по-прежнему "по умолчанию". Вот как работает Javascript, больше информации здесь: Javascript по ссылке против по значению

Но когда вы используете функцию "getDomain", вы получите обновленное значение.

Также взгляните на синтаксис get/set: Getter

Другие вопросы по тегам