Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Object.freeze(this) - Dúvida sobre o funcionamento

Olá pessoal, estou fazendo o curso de ES6 a primeira parte.

Seguindo os exercícios me deparei com o seguinte exemplo:

class Conta {

    constructor(titular, tipo, ) {

        this._titular = titular;
        this._tipo = tipo;
        this._saldo = 0.0;
    }

    deposita(valor){
        console.log(`Você depositou ${valor}`);
        return this._saldo+=valor;
    }

Gostaria de entender no caso dessa classe, onde eu devo congela-la com o Object.freeze()?

Quando passo ele depois do this._saldo=0.0 , recebo:

Uncaught TypeError: Cannot assign to read only property '_saldo' of object '#<Conta>'

Acredito que é pelo fato de eu já atribuir um valor inicial de 0.0 quando a classe é instanciada.

Obrigado a todos.

1 resposta
solução!

Bom dia Thiago,

O Object.freeze() seria utilizado no final do construtor, assim:

constructor(titular, tipo, ) {

        this._titular = titular;
        this._tipo = tipo;
        this._saldo = 0.0;
        Object.freeze(this);
    }

O problema é que desse jeito vamos congelar o saldo, e vamos acabar quebrando o método deposita. Uma solução é transformar o saldo em um objeto, assim o Object.freeze não vai funcionar nele, já que ele estará em uma camada mais profunda.

Veja o exemplo abaixo:

class Conta {

    constructor(titular, tipo) {

        this._titular = titular;
        this._tipo = tipo;
        this._saldo = {
            saldo : 0.0
        };
        Object.freeze(this);
    }

    deposita(valor){
        console.log(`Você depositou ${valor}`);
        return this._saldo.saldo+=valor;
    }
}

//Teste

let conta = new Conta("Oswaldo", "Poupanca");
alert(conta._titular);
conta._titular = "Pedro";
alert(conta._titular);
conta.deposita(200);
alert(conta._saldo.saldo);

Abraços