1
resposta

Uso de Getter em JavaScript: Por que não restringir a alteração do valor diretamente na classe?

Estou com uma dúvida sobre o uso de getters em JavaScript no contexto de um código do meu curso. Tenho o seguinte trecho de código:

get cpf(){
    return this._cpf;
}

Quando tento atribuir um valor diretamente à propriedade cpf, como no código abaixo:

cliente1.cpf = 1231456;

O JavaScript me impede de fazer isso, o que é esperado, já que estou usando um getter para a propriedade _cpf. No entanto, o que me gera dúvida é o fato de que, quando tento modificar diretamente o valor de _cpf (que é a variável interna), consigo fazer isso sem nenhum problema.

Não seria mais adequado e seguro usar o getter diretamente dentro da própria classe para restringir o acesso e garantir que o valor de _cpf não possa ser modificado diretamente? Isso não evitaria que alguém altere o valor de forma indesejada sem a necessidade de um getter separado?

1 resposta

Oi, Pedro! Tudo bem?

Em JavaScript, os getters são usados para controlar o acesso à propriedade, permitindo que você execute lógica adicional quando o valor é acessado. No entanto, eles não impedem diretamente a modificação da variável interna. Para restringir a modificação direta da propriedade _cpf, você pode adotar algumas práticas:

  1. Encapsulamento Completo com Getters e Setters: Além do getter, você pode criar um setter para controlar como e quando a propriedade pode ser modificada. Por exemplo:

    class Cliente {
        constructor(cpf) {
            this._cpf = cpf;
        }
    
        get cpf() {
            return this._cpf;
        }
    
        set cpf(novoCpf) {
            // Aqui você pode adicionar lógica para validar ou formatar o CPF
            if (this.validarCpf(novoCpf)) {
                this._cpf = novoCpf;
            } else {
                console.log("CPF inválido");
            }
        }
    
        validarCpf(cpf) {
            // Lógica de validação de CPF
            return true; // Simplesmente um exemplo
        }
    }
    

    Com isso, ao tentar fazer cliente1.cpf = 1231456;, a lógica dentro do setter será executada.

  2. Uso de Convenções: Embora não haja uma forma nativa de tornar uma propriedade verdadeiramente privada em JavaScript (até a introdução de campos privados com # no ECMAScript mais recente), usar a convenção de prefixar propriedades privadas com _ serve como um lembrete para outros desenvolvedores de que essa propriedade não deve ser acessada ou modificada diretamente.

  3. Campos Privados: Se você estiver usando uma versão mais recente do JavaScript, pode utilizar campos privados com # para tornar a propriedade inacessível fora da classe:

    class Cliente {
        #cpf;
    
        constructor(cpf) {
            this.#cpf = cpf;
        }
    
        get cpf() {
            return this.#cpf;
        }
    }
    

Com isso, cliente1.#cpf = 1231456; resultaria em um erro, pois #cpf é privado.

Espero ter ajudado!

Siga firme nos seus estudos e conte com o fórum sempre que precisar!

Abraços :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado