Pois bem, imagine você trabalhando com uma grande aplicação JavaScript e muitos
desenvolvedores. E você precisa encontrar uma maneira de encapsular seçoes de códigos
para que eles tenham um namespace privado sem que haja conflitos com o código
existente.
Como você faria isso? Ora! com Módulos (Module Pattern)
O Module pattern usa "funcões imediatas" para criar uma Closure para todo
seu código encapsulado. Você pode ter membros privados e até mesmo publicar APIs publicas
Vamos a um exemplo básico:
var Modulo = (function() { var _variavelPrivada = "Esta é privada"; var _outraVariavelPrivada = "Eu também sou privada"; public = {}; //Este objeto será retornado. function _metodoPrivado() { console.log("Este método é privado"); }; public.acessarMetodoPrivado = function(){ _metodoPrivado(); }; public.propriedadePublica = "Esta é uma propriedade publica"; public.metodoPublico = function() { console.log("Este é um método publico"); }; return public; })() console.log(Modulo._variavelPrivada); //imprime "undefined". Modulo._metodoPrivado; //Lança um erro ao executar. console.log(Modulo.propriedadePublica); //imprime "Esta é uma propriedade publica" Modulo.metodoPublico(); //imprime "Este é um método publico"
Acessando Métodos privados
E o JavaScript é impressionante pois nos permite invocar métodos privados
através de nossos métodos publicos, observe:
Modulo.acessarMetodoPrivado(); //imprime "Este método é privado"
O padrão Module Pattern é um excelente exemplo de usar Closure para
gerenciar escopo. Dentro do Módulo existe um âmbito privado que é protegido
de modificação.
Isso não é tudo, você pode ainda extender o Modulo facilmente através
de outra "funcão imediata". Tudo que você tem a fazer é passar o Modulo
original como um novo argumento para a "funcão imediata". Vejamos:
var Modulo2 = (function(Modulo){ //Acesso ao módulo Modulo.metodoPublico(); return Modulo; })(Modulo)
Conforme o código acima, o Modulo2 tem todas propriedades e métodos publicos do Modulo e pode assim acessá-los.
var Modulo2 = (function(Modulo){ //Outro método Modulo.novoMetodo = function() { console.log("Novo método"); }; return Modulo; })(Modulo || {}) console.log(Modulo); //Imprime Object {propriedadePublica: "Esta é uma propriedade publica", metodoPublico: function, novoMetodo: function}
Vemos que o método foi adicionado ao módulo inicial(Modulo).
Contudo o Padrão de Projeto Module é altamente flexivel por fazer
grande uso de caracteristicas dinâmicas do JavaScript. É também usado nas bibiotecas
JavaScript modernas, por exemplo JQuery.
Por fim é isso amigos, essa é mais uma boa prática de JavaScript
Mais conhecimentos avançados e padrões de projetos estão por vir aqui neste blog fiquem ligados.