Métodos acessores
São métodos para simular uma função de um objeto em um atributo.
Além disso tem a função de proteger um atributo (validar o tipo do input do método setter, por exemplo).
Sintaxe
Método getter
{
// ...
get: function() {
return [valor da propriedade]
},
// ...
}
Método setter
set: function([valor]) {
[atribuir esse valor à propriedade]
}
Exemplo
Método getter
function Produto(nome, preco, estoque) {
this.nome = nome;
this.preco = preco;
this.estoque = estoque;
Object.defineProperty(this, "estoque", {
enumerable: true,
configurable: false,
get: function() { return estoque }
});
}
const produto = new Produto("Camiseta", 20, 3);
console.log(produto); // Produto { nome: 'Camiseta', preco: 20, estoque: [Getter] }
Método setter
function Produto(nome, preco, estoque) {
this.nome = nome;
this.preco = preco;
this.estoque = estoque;
Object.defineProperty(this, "estoque", {
enumerable: true,
configurable: false,
get: function() { return estoque },
set: function(valor) {
if (typeof valor !== "number") {
console.log("Valor inválido");
return
}
estoque = valor;
}
});
}
const produto = new Produto("Camiseta", 20, 3);
console.log(produto); // Produto { nome: 'Camiseta', preco: 20, estoque: [Getter/Setter] }
Declaração dos métodos acessores de forma dinâmica
A propriedade velocidade
pode ser acessada diretamente através da notação .
(sem nenhuma validação de input).
class Carro {
constructor(nome) {
this.nome = nome;
this.velocidade = 0;
}
acelerar() {
if (this.velocidade >= 100) return;
this.velocidade++;
}
freiar() {
if (this.velocidade <= 0) return;
this.velocidade--;
}
}
const carro = new Carro("Fusca");
carro.velocidade = 1500; // Valor inesperado
console.log(carro); // Carro { nome: 'Fusca', velocidade: 1500 }
Proteger a propriedade velocidade
com métodos acessores e o encapsular esse atributo.
const _velocidade = Symbol("velocidade");
class Carro {
constructor(nome) {
this.nome = nome;
this[_velocidade] = 0;
}
get velocidade() {
return this[_velocidade];
}
set velocidade(valor) {
if (typeof valor !== "number") return;
if (valor >= 100 || valor <= 0) return;
this[_velocidade] = valor;
}
acelerar() {
if (this[_velocidade] >= 100) return;
this[_velocidade]++;
}
freiar() {
if (this[_velocidade] <= 0) return;
this[_velocidade]--;
}
}
const carro = new Carro("Fusca");
carro.velocidade = 1500;
console.log(carro.velocidade); // 0
carro.velocidade = 99;
console.log(carro.velocidade); // 99
Observação
this[_velocidade]
é a declaração de uma propriedade a partir da notação dearray
(possibilita a sua declaração de forma dinâmica)