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?