[Javascript] Por que é possível alterar propriedades de Objetos armazenados em constantes?

Web Adventures
4 min readJan 14, 2022

Sabemos que é uma boa prática armazenar em constantes os dados na qual não temos a intenção de alterar, evitando assim sobrescrever valores acidentalmente, o que gera uma maior solidez e confiabilidade em nosso código.

Mas então, por que continua sendo possível alterar as propriedades de objetos que foram armazenados em constantes?

Revisando tipos por Referência

Vamos recapitular: no que se refere à atribuição de valores, existem dois tipos de dados em Javascript:

  • Tipos Primitivos (number, string, boolean, symbol, null e undefined)
  • Tipos por Referência (objetos, funções, arrays…)

Os objetos fazem parte dos tipos por referência. Desta forma, assim como os arrays e as funções, quando armazenamos um objeto em uma variável ou constante, o que realmente é armazenado não é o valor do objeto, e sim o endereço de memória que aponta para este objeto!

Para visualizar esta característica, vamos definir um objeto e armazená-lo numa constante pessoa:

Note que: o que pessoa realmente armazena, não é o valor { nome: ‘Rodoaldo’ } como normalmente esperaríamos, mas sim o endereço de memória que aponta para este objeto!

Matando a charada!

Logo, quando alteramos as propriedades de um objeto, não estamos alterando o valor da constante (o endereço de memória), mas sim os valores internos do objeto na qual essa constante aponta:

Internamente, pessoa continua armazenando e referenciando o mesmo endereço de memória, que aponta para o nosso objeto, modificar as propriedades de um objeto não altera a referência ao objeto.

E se eu reatribuir o objeto inteiro?

Reatribuir outro objeto (ou qualquer outro valor) a uma constante irá alterar também o endereço de memória na qual ela aponta. Será um objeto totalmente novo, e sendo assim, um erro será retornado, pois estamos tentando reatribuir valores a uma constante. Vamos testar?

Dessa vez, tentamos reatribuir um novo objeto, e não alterar as propriedades de um objeto já existente. Sendo assim, para um novo objeto, precisamos de um novo endereço de memória que o referenciará.

Por estamos tentando armazenar este novo endereço em uma constante, um erro será retornado, pois sabemos que valores de constantes não podem ser sobrescritos.

Há como criar um objeto “realmente constante” ?

Bom, já estamos cientes que armazenar um objeto em uma constante não impede que modificações sejam feitas em suas propriedades, então como criamos objetos imutáveis?

Object.freeze

Para esta tarefa, temos o método Object.freeze. Como sugere seu nome, sua missão é “congelar” um objeto em seu estado atual, impedindo qualquer tipo de modificação em suas propriedades. Mãos à obra!

Object.freeze recebe como argumento o objeto que você deseja tornar imutável. Após a execução do método (linha 5), o objeto pessoa não poderá mais ter suas propriedades alteradas, se tornando um objeto constante.

Perceba que tentamos executar várias ações no nosso objeto, como alterar, adicionar e apagar propriedades. Apesar disso, pessoa contém as mesmas propriedades do momento na qual ele foi “congelado”.

Apesar de não retornar um erro, as linhas que tentam modificar um objeto “congelado” serão ignoradas. Se preferir obter um erro nestes casos, utilize a diretiva “strict mode”.

Resumão para consultas futuras

A razão na qual é possível alterar propriedades em objetos armazenados em constantes se dá pelo fato de que objetos são estruturas do tipo referência. Isto implica que o que é realmente armazenado na constante não é o objeto propriamente dito, mas sim o endereço de memória que aponta para o objeto.

Sendo assim, alterar suas propriedades não significa sobrescrever a estrutura do objeto por completo, a constante continua armazenando o mesmo endereço, pois o objeto é o mesmo.

Porém, reatribuir um novo objeto, ou qualquer outro valor a esta constante, resultará em um erro. Pois um novo objeto tem um novo endereço de memória que precisaria ser atribuído à esta constante. E como sabemos, uma constante não pode ter seu valor sobrescrito.

Para criar objetos realmente constantes, utilizamos o método Object.freeze. Sua função é “congelar” as propriedades de um objeto, impedindo que elas sejam modificadas, tornando-o imutável.

Sintaxe: Object.freeze( objetoASeCongelar )

Isso é tudo, pessoal!

Obrigado por ter acompanhado até aqui, espero ter ajudado! Estarei deixando o material utilizado nesta postagem para quem desejar se aprofundar mais.

Até a próxima!

Referências

--

--