Padrão de módulo - Como dividir o código de um módulo em diferentes arquivos js?
Para o padrão de módulo, estou fazendo algo como:
(function(namespace) {
// tons of code
// blabla
})(window.myGlobalNamespace);
Como faço para dividir o código? Posso pensar em algumas maneiras, como usar uma hierarquia de namespaces ou expandir o objeto fora porwindow.myGlobalNamespace.additionalFunc = function () {//blabla}
. Quais são as outras maneiras? Quais são os prós e contras? Qual deles é considerado melhor prática?
Ambas as duas respostas sugerem RequireJS. Você pode, por favor, explicar como o RequireJS pode resolver estes problemas:
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
E as pessoas podem fazer
window.myGlobalNamespace.subNamspace.childFunction = function() {alert("a new function");}
para mudar o comportamento do meu código!
Aqui, existem dois problemas:
Não podemos ter um campo acessível a crianças, mas não a públicos externos (por exemplo, protegidos). Existe alguma maneira de conseguir isso?
Se não, ou seja, se quisermos que o PrivatePrivate esteja acessível, precisamos torná-lo público. Então o usuário poderá modificá-lo!
Além disso, todas as funções públicas podem ser alteradas e substituídas. Eu não quero que isso aconteça.
Eu não vejo como RequireJS resolve esses problemas. Alguém pode lançar alguma luz?