Resumo : neste tutorial, você aprenderá sobre campos privados JavaScript e como usá-los de maneira eficaz.
Introdução aos campos privados JavaScript
ES2022 permite definir campos privados para uma classe . Para definir um campo privado, você prefixa o nome do campo com o #
sinal.
Por exemplo, o seguinte define a Circle
classe com um campo privado radius
:
class Circle {
#radius;
constructor(value) {
this.#radius = value;
}
get area() {
return Math.PI * Math.pow(this.#radius, 2);
}
}
Linguagem de código: JavaScript ( javascript )
Neste exemplo:
- Primeiro, defina o campo privado
#radius
no corpo da classe. - Segundo, inicialize o
#radius
campo no construtor com um argumento. - Terceiro, calcule a área do círculo acessando o
#radius
campo privado no método getter.
O seguinte cria uma nova instância da Circle
classe e calcula sua área:
let circle = new Circle(10);
console.log(circle.area); // 314.1592653589793
Linguagem de código: JavaScript ( javascript )
Por #radius
ser um campo privado, você só pode acessá-lo dentro da Circle
classe. Em outras palavras, o #radius
campo é invisível fora da Circle
classe.
Usando getter e setter para acessar campos privados
O seguinte redefine a Circle
classe adicionando o radius
getter e o setter para fornecer acesso ao #radius
campo privado:
class Circle {
#radius = 0;
constructor(radius) {
this.radius = radius; // calling setter
}
get area() {
return Math.PI * Math.pow(this.#radius, 2);
}
set radius(value) {
if (typeof value === 'number' && value > 0) {
this.#radius = value;
} else {
throw 'The radius must be a positive number';
}
}
get radius() {
return this.#radius;
}
}
Linguagem de código: JavaScript ( javascript )
Como funciona.
- O
radius
setter valida o argumento antes de atribuí-lo ao#radius
campo privado. Se o argumento não for um número positivo, oradius
setter gera um erro. - O
radius
getter retorna o valor do#radius
campo privado. - O construtor chama o
radius
setter para atribuir o argumento ao#radius
campo privado.
Campos privados e subclasses
Os campos privados só são acessíveis dentro da classe onde estão definidos. Além disso, eles não são acessíveis nas subclasses. Por exemplo, o seguinte define a Cylinder
classe que estende a Circle
classe:
class Cylinder extends Circle {
#height;
constructor(radius, height) {
super(radius);
this.#height = height;
// cannot access the #radius of the Circle class here
}
}
Linguagem de código: JavaScript ( javascript )
Se você tentar acessar o #radius
campo privado da Cylinder
classe, receberá um arquivo SyntaxError
.
O in
operador: verifique se existem campos privados
Para verificar se um objeto possui um campo privado dentro de uma classe, você usa o in
operador:
fieldName in objectName
Por exemplo, o seguinte adiciona o hasRadius()
método estático à Circle
classe que usa o in
operador para verificar se o circle
objeto possui o #radius
campo privado:
class Circle {
#radius = 0;
constructor(radius) {
this.radius = radius;
}
get area() {
return Math.PI * Math.pow(this.radius, 2);
}
set radius(value) {
if (typeof value === 'number' && value > 0) {
this.#radius = value;
} else {
throw 'The radius must be a positive number';
}
}
get radius() {
return this.#radius;
}
static hasRadius(circle) {
return #radius in circle;
}
}
let circle = new Circle(10);
console.log(Circle.hasRadius(circle));
Linguagem de código: JavaScript ( javascript )
Saída:
true
Linguagem de código: JavaScript ( javascript )
Campos privados estáticos
O exemplo a seguir mostra como usar um campo privado estático:
class Circle {
#radius = 0;
static #count = 0;
constructor(radius) {
this.radius = radius; // calling setter
Circle.#count++;
}
get area() {
return Math.PI * Math.pow(this.radius, 2);
}
set radius(value) {
if (typeof value === 'number' && value > 0) {
this.#radius = value;
} else {
throw 'The radius must be a positive number';
}
}
get radius() {
return this.#radius;
}
static hasRadius(circle) {
return #radius in circle;
}
static getCount() {
return Circle.#count;
}
}
let circles = [new Circle(10), new Circle(20), new Circle(30)];
console.log(Circle.getCount());
Linguagem de código: JavaScript ( javascript )
Como funciona.
Primeiro, adicione um campo estático privado #count
à Circle
classe e inicialize seu valor como zero:
static #count = 0;
Linguagem de código: JavaScript ( javascript )
Segundo, aumente em #count
um no construtor:
Circle.#count++;
Linguagem de código: JavaScript ( javascript )
Terceiro, defina um método estático que retorne o valor do #count
campo estático privado:
static getCount() {
return Circle.#count;
}
Linguagem de código: JavaScript ( javascript )
Por fim, crie três instâncias da Circle
classe e envie o count
valor para o console:
let circles = [new Circle(10), new Circle(20), new Circle(30)];
console.log(Circle.getCount());
Linguagem de código: JavaScript ( javascript )
Resumo
- Coloque um sinal no nome do campo
#
para torná-lo privado. - Os campos privados são acessíveis apenas dentro da classe, não fora da classe ou subclasses.
- Use o
in
operador para verificar se um objeto possui um campo privado.