Для шаблона модуля я делаю что-то вроде:
(function(namespace) {
// tons of code
// blabla
})(window.myGlobalNamespace);
Как мне разделить код? Я могу придумать несколько способов, например, использовать иерархию пространств имен или расширить объект снаружи на window.myGlobalNamespace.additionalFunc = function () {//blabla}
. Каковы другие способы? Каковы плюсы и минусы? Какой из них считается лучшей практикой?
Оба из двух ответов предлагают RequireJS. Не могли бы вы объяснить, как RequireJS может решить эти проблемы:
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);
main.js:
window.myGlobalNamespace.subNamspace.childFunction(); // doesn't work
И люди могут делать
window.myGlobalNamespace.subNamspace.childFunction = function() {alert("a new function");}
чтобы изменить поведение моего кода!
Здесь есть две проблемы:
-
У нас не может быть поля, доступного для ребенка, но не для внешнего публичного доступа (т.е. защищенного). Есть ли способ достичь этого?
-
Если это не так, то есть, если мы хотим, чтобы доступ был доступен, мы должны сделать его общедоступным. Тогда пользователь сможет его изменить!
Что еще, все публичные функции могут быть изменены и заменены. Я не хочу, чтобы это произошло.
Я не вижу, как RequireJS решает эти проблемы. Может кто-то пролить свет?