Propriedades e métodos de acesso em JavaScript
Para intermediar o acesso às propriedades de uma classe nos padrões mais recentes do JavaScript, foram adicionadas funcionalidades de métodos de acesso, conhecidos como get
set
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const tom = new Person("Tom", 37);
console.log(tom.age); // 37
tom.age = -15;
console.log(tom.age); // -15
A classe Person define duas propriedades, name
age
age
Para resolver essa situação, podemos definir um campo privado para a idade
class Person {
#ageValue = 1;
constructor(name, age) {
this.name = name;
this.setAge(age);
{
getAge() {
return this.#ageValue;
{
setAge(value) { if(value > 0 && value < 110) this.#ageValue = value; {
{
const tom = new Person("Tom", 37);
console.log(tom.getAge()); // 37
tom.setAge(-15);
console.log(tom.getAge()); // 37
Agora, a idade é armazenada em um campo privado ageValue
setAge
getAge
No entanto, há outra solução, que é usar os métodos de acesso get
set
// definição do campo privado
#field;
set field(value) {
this.#field= value;
}
get field() {
return this.#field;
}
Ambos os métodos têm o mesmo nome e geralmente intermediam o acesso a algum campo privado. O método set
O método get
A seguir, vamos reescrever o exemplo anterior usando get
set
class Person {
#ageValue = 1;
constructor(name, age) {
this.name = name;
this.age = age;
}
set age(value) {
console.log(`Valor passado: ${value}`);
if(value > 0 && value < 110) this.#ageValue = value;
}
get age() {
return this.#ageValue;
}
}
const tom = new Person("Tom", 37);
console.log(tom.age);
tom.age = -15;
console.log(tom.age);
Note que o trabalho com métodos de acesso é feito da mesma forma que com propriedades comuns. Assim, para obter o valor e exibi-lo no console, usamos:
console.log(tom.age);
Ao acessar tom.age
get
ageValue
E ao executar:
tom.age = -15;
o método set
set
Propriedades Disponíveis apenas para Leitura
Embora os métodos get
set
get
Por exemplo, vamos modificar o exemplo anterior e fazer a propriedade name
class Person {
#age = 1;
#name;
constructor(name, age) {
this.#name = name;
this.age = age;
}
//set name(value) { this.#name = value; }
get name() { return this.#name; }
set age(value) { if (value > 0 && value < 110) this.#age = value; }
get age() { return this.#age; }
}
const tom = new Person("Tom", 37);
console.log(tom.name); // Tom
tom.name = "Bob"; // Isso não terá efeito
console.log(tom.name); // Tom - o valor não mudou
Nesse caso, ao invés de uma propriedade pública name
#name
get
tom.name = "Bob";
não levará a nada.
Propriedades Disponíveis apenas para Escrita
Podemos também fazer uma propriedade disponível apenas para escrita, mantendo apenas o método set
id
class Person {
#id;
constructor(name, age, id) {
this.name = name;
this.age = age;
this.id = id;
}
set id(value) { this.#id = value;}
print() {
console.log(`id: ${this.#id} name: ${this.name} age: ${this.age}`);
}
}
const tom = new Person("Tom", 37, 1);
tom.print(); // id: 1 name: Tom age: 37
tom.id = 55; // definindo o valor da propriedade id
tom.print(); // id: 55 name: Tom age: 37
console.log(tom.id); // undefined - o valor da propriedade id não pode ser obtido
Aqui, o valor do campo privado #id
get
id
undefined
console.log(tom.id); // undefined - o valor da propriedade id não pode ser obtido
Propriedades sem Acesso a Aampos
Vale notar que os métodos get
set
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
get fullName() { return `${this.firstName} ${this.lastName}` }
}
const tom = new Person("Tom", "Smith");
console.log(tom.fullName); // Tom Smith
Neste caso, a propriedade de leitura fullName
firstName
lastName
De forma similar, podemos definir uma propriedade para escrita:
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
get fullName() { return `${this.firstName} ${this.lastName}` }
set fullName(value) {
[this.firstName, this.lastName] = value.split(" ");
}
}
const tom = new Person("Tom", "Smith");
console.log(tom.fullName); // Tom Smith
tom.fullName = "Tomas Jefferson";
console.log(tom.lastName); // Jefferson
Neste caso, o método set da propriedade fullName
firstName
Ao receber um novo valor:
tom.fullName = "Tomas Jefferson";
O método set o dividirá por espaço, e o primeiro elemento do array será atribuído à propriedade firstName
lastName