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 de array (possibilita a sua declaração de forma dinâmica)

Referências