Ранее я сталкивался с проблемами сокрытия данных при модуляризации в JavaScript. Пожалуйста, смотрите ссылки ниже:
Шаблон модуля - Как разделить код одного модуля на разные файлы js?
JavaScript — извлекать функцию, сохраняя ее приватной
Чтобы проиллюстрировать проблему, см. пример ниже. Моя цель — разделить мой длинный файл js на 2 файла, но некоторым функциям необходимо получить доступ к некоторым закрытым переменным:
first.js:
(function(context) {
var parentPrivate = 'parentPrivate';
})(window.myGlobalNamespace);
second.js:
(function(context) {
this.childFunction = console.log('trying to access parent private field: ' + parentPriavte);
}(window.myGlobalNamespace.subNamspace);
Теперь это не сработает, потому что у ребенка нет доступа к родителю. Одно из решений — сделать parentPrivate
общедоступным, но в моем случае это неприемлемо.
Цитируя @Louis, который дал ответ на один из предыдущих вопросов:
«У нас не может быть поля, доступного ребенку, но не доступного для посторонних (то есть защищенного). Есть ли способ добиться этого?»
Если вам нужна модульность (т. е. вы хотите, чтобы дочерний элемент кодировался отдельно от родителя), я не верю, что это возможно в JavaScript. Можно было бы, чтобы дочерний и родительский элементы работали в одном и том же замыкании, но тогда это не было бы модульным. Это верно как с RequireJS, так и без него.
Проблема в том, что родитель и дочерний элемент не находятся внутри одного замыкания. Поэтому я думаю, есть ли смысл создавать библиотеку, которая ставит файлы в одно и то же замыкание?
Что-то типа:
concatenator.putIntoOneClosure(["public/js/first.js", "public/js/second.js"]);
Конечно, мы можем использовать больше аргументов для указания пространств имен и т. д. Обратите внимание, что это не та функциональность, которую мы получаем от RequireJS. RequireJS достигает модуляризации, в то время как этот конкатенатор фокусируется на сокрытии данных при условии модульности.
Так имеет ли что-либо из вышеперечисленного смысл? Или я упускаю какие-то важные моменты? Любые мысли приветствуются.