Middle
¿Cómo se puede prohibir la modificación de un objeto en JavaScript?
sobes.tech AI
Respuesta de la IA
Se pueden usar los métodos incorporados de Object:
Object.preventExtensions(obj): Prohíbe agregar nuevas propiedades al objeto, pero permite modificar y eliminar las existentes.Object.seal(obj): Prohíbe agregar y eliminar propiedades, pero permite modificar las existentes. De hecho, esto espreventExtensions+ prohibición de eliminación.Object.freeze(obj): Prohíbe agregar, eliminar y modificar propiedades. Hace que el objeto sea inmutable en profundidad. Esto esseal+ prohibición de modificar las propiedades existentes.
Ejemplo de uso:
// Objeto inicial
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // No tendrá efecto en modo estricto, en modo no estricto simplemente se ignorará.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Funcionará
delete mySealedObject.name; // No funcionará en modo estricto.
mySealedObject.city = 'Paris'; // No funcionará en modo estricto.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // No tendrá efecto en modo estricto.
delete myFrozenObject.name; // No tendrá efecto en modo estricto.
myFrozenObject.city = 'New York'; // No tendrá efecto en modo estricto.
Es importante recordar que Object.freeze es superficial. Si el objeto contiene referencias a otros objetos, estos objetos anidados podrán modificarse si no están congelados. Para congelar en profundidad, se requiere una función recursiva.
// Ejemplo de congelación profunda
function deepFreeze(obj) {
Object.freeze(obj); // Congela el objeto actual
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Si la propiedad es un objeto (y no null), se congela recursivamente
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // No tendrá efecto en modo estricto.
Tabla comparativa:
| Método | Añadir propiedades | Eliminar propiedades | Modificar propiedades |
|---|---|---|---|
Object.preventExtensions() |
No | Sí | Sí |
Object.seal() |
No | No | Sí |
Object.freeze() |
No | No | No |