Я изучал инкапсуляцию в Javascript с помощью шаблон модуля. Я хочу предоставить доступ к определенным файлам js. Насколько я понимаю, можно только ограничить доступ ко всему и дать доступ ко всему, это правильно?
смайлик
(function(exports){
function smiley(string){
return string + ' :)';
};
exports.smiley = smiley;
})(this);
play.js
smiley('Hello');
Учитывая HTML-файл, который включает в себя smiley.js и play.js.
<script src='smiley.js'></script>
<script src='play.js'></script>
Возможно ли иметь другой файл js, который не имеет доступа к smiley.js, но также включен в файл HTML?
Есть ли только глобальная (оконная) область и частная область, или я могу указать область для разных файлов?
Если я правильно понимаю ваш вопрос, то скажу:
const Script1 = (function () {
// Encapsulate the logic.
const Logic = {
sayHi () {
alert('Script1 says hi!');
},
shutUp () {
alert('Shut up!');
}
};
// Public attributes.
return {
sayHi () {
Logic.sayHi();
}
}
})();
document.addEventListener('DOMContentLoaded', function () {
Script1.sayHi(); // Will successfully work.
// Script1.shutUp(); -> Will say "Script1.shutUp is not a function".
});
В принципе идея проста. Внутри самозапускающейся функции вы объявляете объект, который будет содержать функции и поля данных. Затем из оператора return
самозапуска функции вы можете сделать функции общедоступными. Таким образом, вы можете оставить те, которые вам нужны, частными - частными, а те, которые хотите - доступны - вы можете сделать доступными. То же самое касается нескольких скриптов JS. Просто каждый скрипт объявляет свою собственную функцию самозапуска. Script1, Script2 и т. д.
Это означало бы, что мне нужно было бы переписать свои функции в каждом файле, правильно?
Это шаблон дизайна для вашего кода. Вам решать, как вы поступите. Я бы сказал, дерзайте, если это возможно.
У браузера всего две области - глобальная и функциональная. Если вы инкапсулируете что-то в модуль, это существует в функциональной области. В лучшем случае вы можете создать что-то, что управляет ими, создает нужные вам модули, а затем передает их другим вещам, которые в них нуждаются (инверсия Control), но обычно в этом нет необходимости.