Sobes.tech
Middle

¿Cómo hacer que una propiedad de un objeto sea inmutable?

sobes.tech AI

Respuesta de la IA

Se puede hacer que una propiedad de un objeto sea inmutable de varias maneras:

  1. Usando Object.defineProperty():

    Este método permite definir o modificar las propiedades de un objeto con un control más granular. Para crear una propiedad inmutable, se debe establecer el descriptor de la propiedad con writable: false.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Valor inmutable',
      writable: false, // Hace que la propiedad sea inmutable
      enumerable: true, // La propiedad será visible durante la iteración
      configurable: true // La propiedad podrá ser eliminada o modificar su descriptor
    });
    
    // Intentar cambiar el valor será ignorado en modo no estricto
    // y causará un error TypeError en modo estricto
    obj.myProperty = 'Nuevo valor';
    console.log(obj.myProperty); // Mostrará "Valor inmutable"
    

    Si se establece configurable: false, la propiedad no podrá ser eliminada ni modificar su descriptor (incluyendo writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Inmutable y no eliminable fácilmente',
      writable: false,
      enumerable: true,
      configurable: false // Hace que el descriptor de la propiedad sea inmutable
    });
    
    // Intentar cambiar el valor
    obj2.myProperty = 'Nuevo valor';
    console.log(obj2.myProperty); // Mostrará "Inmutable y no eliminable"
    
    // Intentar eliminar la propiedad
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Mostrará "Inmutable y no eliminable"
    
  2. Usando Object.freeze():

    Este método congela el objeto. Esto significa que no se pueden agregar nuevas propiedades, eliminar las existentes, cambiar los valores de las propiedades existentes (incluyendo su enumerabilidad y configurabilidad), ni modificar el prototipo del objeto.

    const obj = {
      myProperty: 'Valor inmutable'
    };
    
    Object.freeze(obj);
    
    // Intentar cambiar el valor
    obj.myProperty = 'Nuevo valor';
    console.log(obj.myProperty); // Mostrará "Valor inmutable"
    
    // Intentar agregar una nueva propiedad
    obj.newProperty = 'Nuevo';
    console.log(obj.newProperty); // Mostrará undefined
    
    // Intentar eliminar la propiedad
    delete obj.myProperty;
    console.log(obj.myProperty); // Mostrará "Valor inmutable"
    

    Es importante notar que Object.freeze() es superficial. Si una propiedad del objeto es otro objeto, ese objeto interno no será congelado.

  3. Usando const para variables que contienen objetos:

    La palabra clave const hace que la referencia al objeto sea inmutable, pero no el objeto en sí. No podrás reasignar la variable a otro objeto, pero podrás modificar las propiedades del objeto.

    const obj = {
      myProperty: 'Valor inicial'
    };
    
    // Se puede cambiar el valor de la propiedad
    obj.myProperty = 'Nuevo valor';
    console.log(obj.myProperty); // Mostrará "Nuevo valor"
    
    // No se puede reasignar la variable
    // obj = { otraPropiedad: 'Otra' }; // Causará TypeError
    

Comparación de métodos:

Método ¿Qué hace inmutable? Nivel de inmutabilidad
Object.defineProperty() Una propiedad específica Se define mediante el descriptor
Object.freeze() Todo el objeto Superficial
const La referencia al objeto Variable

La elección del método depende de qué tan granular debe ser la inmutabilidad. Para una sola propiedad, Object.defineProperty(), para todo el objeto, Object.freeze(). Para evitar la reasignación de la referencia, se usa const.