Sobes.tech
Middle

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:

  1. 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 configurable for definido como false, a propriedade não poderá ser eliminada nem modificar o seu descritor (incluindo writable).

    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"
    
  2. 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.

  3. Usando const para variáveis que contêm objetos:

    A palavra-chave const torna 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.