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?