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

Date

Fiz alguns testes e me veio a seguinte dúvida:

Minha classe Negociação está assim:

class Negociacao {

    constructor(data, quantidade, valor){

        this._data = new Date(data.getTime());
        this._quantidade = quantidade;
        this._valor = valor;
        Object.freeze(this);
    }

    get data(){
        return new Date(this._data.getTime());
    }

    get quantidade(){
        return this._quantidade;
    }

    get valor(){
        return this._valor;
    }

    get volume(){
        return this._quantidade * this._valor;
    }

}

Meu script no index.html está assim:

let negociacao = new Negociacao(new Date(), 10, 20);
       console.log(negociacao.data);

       negociacao._data.setDate(11);

       console.log(negociacao.data);

E a saída que tenho é a seguinte:

Sun May 28 2017 20:31:19 GMT-0300 (Hora oficial do Brasil)
Thu May 11 2017 20:31:19 GMT-0300 (Hora oficial do Brasil)

Ou seja, consegui alterar a data mesmo usando a programação defensiva. Fiz algo de errado ou é isso mesmo? Seria pelo fato de o Object.freeze(this) não conseguir "congelar" os valores da classe Date?

1 resposta
solução!

Oi Emerson, o freeze congele apenas a referência passada para ele.. O objeto retornado pelo _data é outra referência :(. Você pode conferir aqui na documentação => https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze