Como tornar uma propriedade de objeto imutável?
sobes.tech IA
Resposta da IA
Pode tornar uma propriedade de um objeto imutável de várias maneiras:
-
Usando
Object.defineProperty():Este método permite definir ou modificar as propriedades de um objeto com um controlo mais granular. Para criar uma propriedade imutável, deve-se definir o descritor da propriedade com
writable: false.const obj = {}; Object.defineProperty(obj, 'myProperty', { value: 'Valor imutável', writable: false, // Torna a propriedade imutável enumerable: true, // A propriedade será visível durante a iteração configurable: true // A propriedade pode ser eliminada ou modificar o seu descritor }); // Tentar alterar o valor será ignorado em modo não estrito // e causará um erro TypeError em modo estrito obj.myProperty = 'Novo valor'; console.log(obj.myProperty); // Mostrará "Valor imutável"Se
configurablefor definido como false, a propriedade não poderá ser eliminada nem modificar o seu descritor (incluindowritable).const obj2 = {}; Object.defineProperty(obj2, 'myProperty', { value: 'Inalterável e não facilmente eliminável', writable: false, enumerable: true, configurable: false // Torna o descritor da propriedade imutável }); // Tentar alterar o valor obj2.myProperty = 'Novo valor'; console.log(obj2.myProperty); // Mostrará "Inalterável e não facilmente eliminável" // Tentar eliminar a propriedade delete obj2.myProperty; console.log(obj2.myProperty); // Mostrará "Inalterável e não facilmente eliminável" -
Usando
Object.freeze():Este método "congela" o objeto. Isto significa que não é possível adicionar novas propriedades, eliminar as existentes, alterar os valores das propriedades existentes (incluindo a sua enumerabilidade e configurabilidade), nem modificar o protótipo do objeto.
const obj = { myProperty: 'Valor imutável' }; Object.freeze(obj); // Tentar alterar o valor obj.myProperty = 'Novo valor'; console.log(obj.myProperty); // Mostrará "Valor imutável" // Tentar adicionar uma nova propriedade obj.newProperty = 'Novo'; console.log(obj.newProperty); // Mostrará undefined // Tentar eliminar a propriedade delete obj.myProperty; console.log(obj.myProperty); // Mostrará "Valor imutável"É importante notar que
Object.freeze()é superficial. Se uma propriedade do objeto for outro objeto, esse objeto interno não será congelado. -
Usando
constpara variáveis que contêm objetos:A palavra-chave
consttorna a referência ao objeto imutável, mas não o objeto em si. Não poderá reatribuir a variável a outro objeto, mas poderá modificar as propriedades do objeto.const obj = { myProperty: 'Valor inicial' }; // Pode alterar o valor da propriedade obj.myProperty = 'Novo valor'; console.log(obj.myProperty); // Mostrará "Novo valor" // Não pode reatribuir a variável // obj = { outraPropriedade: 'Outra' }; // Causará TypeError
Comparação de métodos:
| Método | O que torna imutável? | Nível de imutabilidade |
|---|---|---|
Object.defineProperty() |
Uma propriedade específica | Definido pelo descritor |
Object.freeze() |
Todo o objeto | Superficial |
const |
A referência ao objeto | Variável |
A escolha do método depende de quão granular deve ser a imutabilidade. Para uma propriedade, Object.defineProperty(), para todo o objeto, Object.freeze(). Para evitar a reatribuição da referência, usa-se const.