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