¿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:
-
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 (incluyendowritable).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" -
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. -
Usando
constpara variables que contienen objetos:La palabra clave
consthace 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.