Eu pensei em expandir a resposta acima falando sobre como você encaixaria os módulos em um aplicativo. Eu tinha lido sobre isso no livro de Doug Crockford, mas sendo novo no javascript ainda era um pouco misterioso.
Eu venho do fundo ac #, então adicionei alguma terminologia que acho útil a partir daí.
Html
Você terá algum tipo de arquivo html de nível superior. Ajuda pensar nisso como seu arquivo de projeto. Todo arquivo javascript que você adiciona ao projeto quer entrar nisso, infelizmente você não recebe suporte de ferramenta para isso (estou usando o IDEA).
Você precisa adicionar arquivos ao projeto com tags de script como estas:
<script type="text/javascript" src="app/native/MasterFile.js" /></script>
<script type="text/javascript" src="app/native/SomeComponent.js" /></script>
Parece que o colapso das tags faz com que as coisas falhem - enquanto parece que o xml é realmente algo com regras mais loucas!
Arquivo de espaço para nome
MasterFile.js
myAppNamespace = {};
é isso aí. Isso é apenas para adicionar uma única variável global para o restante do nosso código. Você também pode declarar namespaces aninhados aqui (ou em seus próprios arquivos).
Módulo (s)
SomeComponent.js
myAppNamespace.messageCounter= (function(){
var privateState = 0;
var incrementCount = function () {
privateState += 1;
};
return function (message) {
incrementCount();
//TODO something with the message!
}
})();
O que estamos fazendo aqui é atribuir uma função de contador de mensagens a uma variável em nosso aplicativo. É uma função que retorna uma função que executamos imediatamente .
Conceitos
Eu acho que ajuda pensar na linha superior em SomeComponent como sendo o espaço para nome em que você está declarando algo. A única ressalva é que todos os seus namespaces precisam aparecer em algum outro arquivo primeiro - eles são apenas objetos enraizados na nossa variável de aplicativo.
No momento, apenas tomei pequenas medidas com isso (estou refatorando algum javascript normal de um aplicativo extjs para que eu possa testá-lo), mas parece muito bom, pois você pode definir pequenas unidades funcionais e evitar o atoleiro 'this ' .
Você também pode usar esse estilo para definir construtores retornando uma função que retorna um objeto com uma coleção de funções e não chamando imediatamente.