Esta página ha sido traducida del inglés por la comunidad.Aprende más y únete a la comunidad de MDN Web Docs.
Object.freeze()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since julio de 2015.
El métodoObject.freeze()congela un objeto, es decir: impide que se le agreguen nuevas propiedades; impide que se puedan eliminar las propiedades ya existentes; impide que dichas propiedades, o su capacidad de enumeración, configuración, o escritura, puedan ser modificadas; impide también que se pueda modificar su prototipo. El método devuelve el objeto recibido.
In this article
Pruébalo
const obj = { prop: 42,};Object.freeze(obj);obj.prop = 33;// Throws an error in strict modeconsole.log(obj.prop);// Expected output: 42Sintaxis
Object.freeze(obj)
Parámetros
objEl objeto acongelar.
Valor devuelto
El mismo objeto
Descripción
Nada puede ser agregado o removido de las propiedades establecidas de un objetocongelado. Cualquier intento de hacerlo fallará, ya sea de manera silenciosa oarrojando una excepciónTypeError (más comunmente, pero no exclusivamente, enstrict mode).
Los valores no pueden ser cambiados por propiedades de datos. Propiedades de acceso (getters ysetters) funcionan igual (y aún dan la ilusión de que estas cambiando el valor). Note que los valores que son objetos aún pueden ser modificados, a menos que estencongelados tambien.
La función retorna el mismo objeto pasado en ella, no crea una copiacongelada
Ejemplos
>Congelando Objetos
var obj = { prop: function () {}, foo: "bar",};// Nuevas propiedades pueden ser agregadas,// propiedades existentes pueden cambiar o removerseobj.foo = "baz";obj.lumpy = "woof";delete obj.prop;// Ambos, el objeto pasado como argumento tanto como el que se regresa// serán congelados// Es innecesario salvar el objeto que es regresado en orden de congelar// el original.var o = Object.freeze(obj);assert(Object.isFrozen(obj) === true);// Ahora cualquier cambio fallaráobj.foo = "quux"; // No hace nada de manera silenciosaobj.quaxxor = "the friendly duck"; // No agrega una nueva propiedad, de manera silenciosa// ...y en modo estricto tal intento arrojará TypeErrorsfunction fail() { "use strict"; obj.foo = "sparky"; // arroja un TypeError delete obj.quaxxor; // arroja un TypeError obj.sparky = "arf"; // arroja un TypeError}fail();// Los intentos utilizando Object.defineProperty tambien arrojarán una excepción...Object.defineProperty(obj, "ohai", { value: 17 }); // arroja un TypeErrorObject.defineProperty(obj, "foo", { value: "eit" }); // arroja un TypeError// Es imposible cambiar un prototipo// Estos ejemplos retornan un error TypeErrorObject.setPrototype(obj, { x: 20 });obj.__proto__ = { x: 20 };El siguiente ejemplo muestra que los valores de objetos en un objeto congelado pueden ser mutados (la congelación es superficial).
obj1 = { internal: {},};Object.freeze(obj1);obj1.internal.a = "aValue";obj1.internal.a; // 'aValue'// Para hacer obj completamente inmutable, congelamos cada objeto en obj.// Para hacerlo, usamos esta función.function deepFreeze(obj) { // Recuperamos el nombre de las propiedades en obj var propNames = Object.getOwnPropertyNames(obj); // Congelamos las propiedades antes de congelar a obj propNames.forEach(function (name) { var prop = obj[name]; // Si la propiedad es un objeto, llamaremos a deepFreezze para que congele las propiedades de ese objeto if (typeof prop == "object" && prop !== null && !Object.isFrozen(prop)) deepFreeze(prop); }); // congelamos a obj return Object.freeze(obj);}obj2 = { internal: {},};deepFreeze(obj2);obj2.internal.a = "anotherValue";obj2.internal.a; // undefinedNotas
En ES5, si el argumento pasado a este método no es un objeto (un primitivo), entonces causará unTypeError. En ES6, un argumento no-objeto será tratado como si fuera un objetocongelado cualquiera, simplemente lo regresa.
> Object.freeze(1)TypeError: 1 is not an object // Código ES5> Object.freeze(1)1 // Código ES6Especificaciones
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-object.freeze> |