Usando WeakMap (Método Mais Antigo)

Antes do suporte nativo a campos privados, uma maneira comum de alcançar o encapsulamento era usando WeakMap para armazenar dados privados.

javascriptCopiar código
const _nome = new WeakMap();
const _idade = new WeakMap();

class Pessoa {
  constructor(nome, idade) {
    _nome.set(this, nome);
    _idade.set(this, idade);
  }

  falar() {
    console.log(`Meu nome é ${_nome.get(this)} e tenho ${_idade.get(this)} anos`);
  }

  getNome() {
    return _nome.get(this);
  }

  setNome(nome) {
    _nome.set(this, nome);
  }

  getIdade() {
    return _idade.get(this);
  }

  setIdade(idade) {
    _idade.set(this, idade);
  }
}

const pessoa = new Pessoa('João', 25);
pessoa.falar();           // Meu nome é João e tenho 25 anos
console.log(pessoa.getNome());  // João
pessoa.setNome('Carlos');
console.log(pessoa.getNome());  // Carlos

Para ilustrar o conceito de encapsulamento em Node.js, podemos aprimorar o exemplo da função construtora Pessoa para utilizar variáveis privadas e métodos públicos. Em JavaScript, uma forma comum de criar variáveis privadas é usando closures dentro da função construtora.

Closures (ou "clausuras") são um conceito fundamental em JavaScript. Quando você define uma função dentro de outra função, a função interna (closure) tem acesso às variáveis e parâmetros da função externa, mesmo após a execução da função externa ter terminado.

Comparação das Abordagens