Isso que você leu na internet não tem relação com design de classes (apesar do autor do código que você postou tentar, sem estar antenado das consequências de seu código, criar algo parecido). Vejamos um exemplo que usa essa estratégia usando ES5:
function Pessoa(nome) {
var nome = nome;
this.getNome = function() {
return nome;
};
this.setNome(nome) {
nome = nome;
}
}
var pessoa = new Pessoa('Flávio Almeida');
console.log(pessoa.getNome());
Veja que desse jeito a única maneira de acessar a variável (VEJA NÃO É UM ATRIBUTO) é através de getNome
(closure em ação). Contudo essa solução possui problemas de performance, pois cada instância da função construtora Pessoa
terá os métodos getNome
e setNome
e isso é muito ruim em termos de performance.
É por isso que esses métodos são colocados no prototype
e quando fazemos isso, não podemos usar variáveis como se fosse atributos porque o prototype não terá acesso à elas. E por isso que usamos propriedades:
function Pessoa(nome) {
this.nome = nome;
}
Pessoa.proprotype.getNome = function() {
return this.nome;
};
Pessoa.prototype.setNome(nome) {
this.nome = nome;
}
var pessoa = new Pessoa('Flávio Almeida');
console.log(pessoa.getNome());
var pessoa2 = new Pessoa('Almeida Flavio');
console.log(pessoa2.getNome());
Nesse caso o getNome
e o setNome
é o mesmo para todos as instâncias. Tem que ficar esperto com o que lemos na internet e seu contexto, o que você viu é verdadeiro, mas não usamos para o design de classes (pode até usar, mas se seu navegador vai explodir é responsabilidade sua). Alias, o ES6 (ES2015) é uma atalho para a forma que eu acabei de escrever, ou seja, quando você cria uma classe e define métodos ele converte para debaixo dos panos para essa estrutura com proptotype, porque a comunidade reconhece essa forma com a mais indicada durante anos.
Contudo, essa estrutura que você mostrou é interessante quando trabalhamos com módulos. Você verá isso ao longo do treinamento e vai gostar, com certeza (no módulo 3 em desenvolvimento precisamos usar esse recurso para lidar com conexão do IndexedDB).