Olá Luan, tudo bem com você?
A proteção do Object.freeze
é feita apenas na primeira camada, então quando fazemos:
const negociacao = new Negociacao( new Date(), 30, 50);
negociacao._quantidade = 80
console.log(negociacao._quantidade);
Veremos que não conseguimos atribuir pois temos apenas uma variável de tipo primitivo , então a proteção é feita pois há apenas uma camada :)
Entretanto Date
nos devolve um objeto, e dessa forma não conseguimos fazer uma proteção completa, se a nossa classe tiver algo parecido como:
get data() {
return this._data;
}
Esse objeto _data
não está totalmente protegido, vou te mostrar com o mesmo exemplo:
console.log(negociacao.data)
> Date Tue May 12 2020 11:19:54 GMT-0300 (Horário Padrão de Brasília)
Agora vou pegar o objeto do tipo data, que temos diversos métodos entre eles um para mudar o mês:
negociacao.data.setMonth(8);
console.log(negociacao.data)
> Date Sat Sep 12 2020 11:19:54 GMT-0300 (Horário Padrão de Brasília)
E veja que conseguimos mudar o mês de Maio para Setembro :)
Dessa forma conseguimos perceber que com objetos não temos toda essa imutabilidade, pois congelamos a primeira camada, se uma dessa camadas for um outro objeto, podemos alterar os dados tranquilamente, como é o caso do atributo Data :)
Quando fazemos igual o instrutor estamos tendo essa garantia de que ele pode alterar tranquilamente a data que não se refletira em nosso objeto!
Abraços e Bons Estudos!