Um dos aspectos do JavaScript que me atraiu como jovem desenvolvedor foi o fato de sua sintaxe ser livre e eu poder codificar rapidamente. À medida que ganha experiência como engenheiro, o senhor começa a perceber que alguma estrutura de codificação tradicional é uma coisa boa, mesmo que isso o torne mais lento. Por exemplo, usar o Jest ou o TypeScript para adicionar tipagem ao JavaScript pode evitar que o senhor tenha dores de cabeça com manutenção e erros inesperados. Embora essas sejam ferramentas de pré-compilação para realizar a estrutura, tradicionalmente empregamos padrões vanilla JavaScript para simular variáveis e métodos privados em JavaScript.

O senhor sabia, no entanto, que os navegadores e a linguagem JavaScript suportam uma sintaxe específica para criar variáveis e funções privadas em classes? Vamos dar uma olhada!

As propriedades e os métodos em uma classe sempre foram considerados públicos; para tornar uma propriedade ou um método privado, adicione um # no início do nome:

class Developer {
  name;
  #age; // Don't tell anyone my age!

  constructor(name, age) {
    this.name = name;
    this.#age = age;
  }
};

const David = new Developer('David', 38);

console.log(David.name); // David
console.log(David.age);  // undefined
console.log(David.#age); // Error!  Uncaught SyntaxError: Private field '#age' must be declared in an enclosing class

David.name está disponível porque name é público, enquanto que age é privado porque é declarado com um #. Da mesma forma, podemos declarar um método privado com #:

class Developer {
  name;
  #age; // Don't tell anyone my age!

  constructor(name, age) {
    this.name = name;
    this.#age = age;
  }

  #getAgeInDogYears() {
    return this.#age * 7;
  }
};

getAgeInDogYears só pode ser chamado de dentro da própria classe por ter sido declarado com #. Podemos expor qualquer informação de dentro da classe, pública ou privada, se a tornarmos disponível por meio de um método público:

class Developer {
  name="";
  #age = 0;
  #ageInDogYears = 0;

  constructor(name, age) {
    this.name = name;
    this.#age = age;

    this.#ageInDogYears = this.#getAgeInDogYears();
  }

  #getAgeInDogYears() {
    return this.#age * 7;
  }

  log() {
    console.log(this.name);
    console.log(this.#age);
    console.log(this.#ageInDogYears);
  }
};

const David = new Developer('David', 38);
David.log();

// David
// 38
// 266

Adicionar uma sintaxe nativa para declarar propriedades e métodos privados de classe é uma adição bem-vinda ao JavaScript; melhor ainda é que o senhor pode fazer isso simplesmente adicionando um # no início de seu nome.

O senhor já escreveu código usando a sintaxe privada em JavaScript? Como foi a experiência?