Eu não consegui entender muito bem por que o _data precisa de algo a mais para realizar sua imutabilidade e o _quantidade e _valor apenas do Object.freeze(). Alguém poderia responder essa minha dúvida??
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Eu não consegui entender muito bem por que o _data precisa de algo a mais para realizar sua imutabilidade e o _quantidade e _valor apenas do Object.freeze(). Alguém poderia responder essa minha dúvida??
Olá Rafael, tudo bem?
Rafael, o que acontece é simples. As propriedades _quantidade e _valor possuem o que podemos a grosso modo dizer apenas 1 nível de valor, ou seja, Ex.: _valor = 10. Agora o Objeto new Date() é um objeto que possuem vários níveis de valores, é como uma classe com vários métodos. Para testar e entender melhor, abra o console no seu navegador e faça o seguinte:
let data = new Date()
data.getDate()
data.getDay()
data.getHours()
data.getMonth()
etc..Veja que a variável data que tem como valor uma instância de new Date() possui vários métodos, Neste caso o Object.freeze() não consegue acessar cada um desses métodos e congela-los, entende?
Ex.:
1-) Primeiro com _valor
this._valor = 0;
this._valor
|___ 02-) Segundo com new Date()
this._data = new Date();
this.data
|__getDate()
|__getHours()
|__getFullYear()
|__getDay()
|__getMonth()
|__etc..Então, como o Object.freeze() é shallow(raso) ele consegue congelar apenas "um nível" de cada elemento, como mostrei no exemplo 2 o objeto Date() possui vários níveis de profundidade e o Object.freeze() não é capaz a acessar cada nível e congelar a todos.
Espero ter ajudado!