Getter e Setter

Definição

O encapsulamento dos atributos de uma classe tem como objeto dar uma maior consistência aos objetos, uma vez que há a padronização na obtenção e na alteração do valor dessa propriedade.

O getter é um método acessor para obter o valor de uma propriedade.

O setter é um método acessor para definir/atualizar um valor de uma propriedade.

Nas versões mais recetes do JavaScript, a declaração dos métodos getter e setter é feito pelas palavras chave get e set, respectivamente:

class Person {
  constructor(
    private _name: string;
  )
 
  get name(): string {
    return this._name;
  }
 
  set name(name: string) {
    this._name = name;
  }
}

Por convenção, os atributos que possuem os métodos getter e setter declarados explicitamente, deveram ser antecedidos por um underline (_). Isso ocorre porque os métodos getter e setter comportam-se como uma propriedade da classe.

IMPORTANTE: o JavaScript/TypeScript não suporta a declaração explícita do tipo de retorno do método setter:

  • Forma incorreta:

    set name(name: string): void {
      this._name = name;
    }
  • Forma correta:

    set name(name: string) {
      this._name = name;
    }

OBS: ao declarar um atributo com métodos acessores declarados explicitamente (_[nome do atributo]), é importante não esquecer do underline, pois caso você não o utilize, em tempo de execução será lançado um erro de StackOverFlow, devido a uma sequência de chamadas recursivas:

class Person {
  constructor(
    private _name: string;
  )
 
  get name(): string {
    return this.name; // chama o próprio método ('get name()')
  }
 
  set name(name: string) {
    this.name = name; // chama o próprio método ('set name()')
  }
}

Exemplo

Forma antiga de declarar getters e setters

class Person {
  constructor(
    private name: string,
    private lastName: string,
    private age: number,
    private cpf: string,
  ) {}
 
  getCpf(): string {
    return this.cpf.replace(/\D/g, ''); // remover qualquer caractere que não seja número
  }
 
  setCpf(cpf: string): void {
    this.cpf = cpf;
  }
}
 
const person = new Person('Luiz', 'Otávio', 30, '000.000.000-00');
person.setCpf('000.000.000-11');
console.log(person.getCpf());

Forma nova de declarar getters e setters

class Person {
  constructor(
    private name: string,
    private lastName: string,
    private age: number,
    private _cpf: string,
  ) {}
 
  get cpf(): string {
    return this._cpf.replace(/\D/g, ''); // remover qualquer caractere que não seja número
  }
 
  set cpf(cpf: string) {
    this._cpf = cpf;
  }
}
 
const person = new Person('Luiz', 'Otávio', 30, '000.000.000-00');
person.cpf = '000.000.000-11';
console.log(person.cpf);