Module pattern
Este padrão tem o foco em encapsular e impedir que variáveis e funções sejam expostas para fora da closure
. Com este encapsulamento, declarar variáveis dentro do módulo não terá impacto sobre o código e nada terá seu hoisting
para o topo do script. Segue um caso de uso:
var tree = (function () {
var apples = 1;
var birds = 0;
function getApples () {
return apples;
}
function getBirds () {
return birds;
}
function setBirds (num) {
if (typeof num === 'number') {
birds = num;
} else {
throw new TypeError('Número obrigatório');
}
}
return {
getApples: getApples,
getBirds: getBirds,
setBirds: setBirds
};
})();
console.log(tree.apples); // undefined
console.log(tree.getApples()); // 1
console.log(tree.birds); // undefined
console.log(tree.setBirds(5));
console.log(tree.getBirds()); // 5
Alternativa OOP
Para os programadores clássicos, há uma maneira de simular este padrão com orientação a objetos e contrutores. Segue o exemplo:
var Person = (function () {
var age = 21; // Somente acessível pelos getters e setters
function Secret (name) { // Construtor para 'new'
this.name = name;
}
Secret.prototype.init = function (name) { // Construtor para Object.create();
if (this.name) return;
this.name = name;
};
Secret.prototype.getAge = function () { // Getter
return age;
};
Secret.prototype.birthday = function () { // Modificando a idade
age++;
};
return Secret;
})();
var guy = new Person('Jonathan');
console.log(guy.age); // undefined
console.log(guy.getAge()); // 21
guy.birthday();
console.log(guy.getAge()); // 22
console.log(guy.name); // "Jonathan"
var girl = Object.create(Person.prototype);
girl.init('Rose'); // Inicializando o construtor com o nome
console.log(girl.name); // Rose
console.log(girl.age); // undefined
console.log(girl.getAge()); // 22 ??
girl.birthday();
console.log(girl.getAge()); // 23 ??
A variável
age
mantém o valor mesmo com outra instância pois aclosure
mantém referência, diferente dothis
. Tome cuidado.
Referências e exemplos
O estudo e feito para este post tiveram grandes referências deste livro excelente sobre padrões em Javscript e deste livro sobre orientação a objetos e padrões. Vale a leitura, mesmo os livros sendo um pouco antigos pois com um aprendizado em JS puro, não há framework que seja impossível de aprender. Um abraço!