Encapsulamento Real em JavaScript com Campos Privados (#field)

Encapsulamento Real em JavaScript com Campos Privados (#field)

Garantir o encapsulamento de dados no JavaScript tradicionalmente dependia de convenções visuais (como o prefixo _) ou Closures, que não impediam o acesso externo direto às propriedades. O uso de campos e métodos privados nativos com o prefixo # resolve esse problema ao fornecer verdadeiro isolamento de estado diretamente na sintaxe de classes ES6+.

JavaScript

class ContaBancaria {
  // Declaração de campos privados (devem ser declarados no topo da classe)
  #saldo = 0;
  #senha;

  constructor(titular, senhaInicial) {
    this.titular = titular; // Propriedade pública
    this.#senha = senhaInicial;
  }

  /**
   * Método público para depositar valores com validação
   */
  depositar(valor) {
    if (valor <= 0) return 'Valor de depósito inválido.';
    this.#saldo += valor;
    this.#validarTransacao('Depósito');
    return `Depósito realizado. Novo saldo: R$ ${this.#saldo}`;
  }

  /**
   * Método privado: inacessível fora do escopo desta classe
   */
  #validarTransacao(tipo) {
    console.log(`[LOG INTERNO] Transação '${tipo}' registrada para ${this.titular}.`);
  }
}

// --- Exemplo Prático de Uso ---
const minhaConta = new ContaBancaria('Ana Silva', '1234');

console.log(minhaConta.depositar(500)); 
// Saída: [LOG INTERNO]... | Depósito realizado. Novo saldo: R$ 500

console.log(minhaConta.titular); // Saída: 'Ana Silva' (Propriedade pública)

// Tentativas de acesso externo a membros privados disparam erro de sintaxe:
// console.log(minhaConta.#saldo); // SyntaxError: Private field '#saldo' must be declared in an enclosing class
// minhaConta.#validarTransacao('Teste'); // SyntaxError

Pontos-chave

  • Garantia de Erro em Tempo de Compilação/Parsing: Tentar acessar ou modificar uma propriedade com # fora do escopo da classe resulta em um SyntaxError imediato, impedindo o bypass acidental.
  • Obrigatoriedade de Declaração Prévia: Diferente das propriedades públicas, todos os campos privados devem ser declarados explicitamente no corpo da classe antes de serem atribuídos dentro do constructor ou de métodos.
  • Incompatibilidade com Operador in Dinâmico: Não é possível checar dinamicamente a presença de campos privados usando Object.keys() ou inspeção de objetos, o que impede vazamentos de abstração e reflexão não autorizada.
  • Suporte Nativo Amplo: Funciona nativamente no Node.js (v12+) e em todos os navegadores modernos sem a necessidade de compiladores externos como Babel ou linguagens auxiliares como TypeScript.

Thales de Oliveira Gomes

Thales de Oliveira Gomes é gestor de Tecnologia da Informação, especialista em infraestrutura de redes, computação em nuvem e operações de TI hospitalar, com mais de 18 anos de experiência na área. Graduado em Gestão de TI e pós-graduado em Engenharia de Redes e Telecomunicações, Cloud Computing, Redes de Computadores e Gestão Hospitalar, construiu uma trajetória sólida liderando projetos de alta complexidade, como a implementação e migração para nuvem de sistemas ERP de grande porte. Sua atuação no setor o levou a ser indicado ao prêmio IT Leaders Brasil na categoria Rising Leaders. Além da carreira corporativa e da paixão por tecnologia, Thales é autor independente com mais de 70 obras publicadas sobre redes, segurança da informação, Linux e física, além de criador de conteúdo no blog Vetor Tech e na plataforma CiberDicas. No universo das artes e do entretenimento, atua como produtor de música eletrônica sob o projeto Yknex, cria ilustrações digitais e compartilha walkthroughs de games no YouTube.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *