[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze [Back]  [Original]

Object.freeze() - JavaScript | MDN

Esta pgina ha sido traducida del ingls por la comunidad. Aprende ms y nete a la comunidad de MDN Web Docs.

View in English Always switch to English

Object.freeze()

Baseline Widely available

This feature is well established and works across many devices and browser versions. Its been available across browsers since julio de 2015.

El mtodo Object.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 enumeracin, configuracin, o escritura, puedan ser modificadas; impide tambin que se pueda modificar su prototipo. El mtodo devuelve el objeto recibido.

In this article

Prubalo

const obj = {
  prop: 42,
};

Object.freeze(obj);

obj.prop = 33;
// Throws an error in strict mode

console.log(obj.prop);
// Expected output: 42

Sintaxis

Object.freeze(obj)

Parmetros

obj

El objeto a congelar.

Valor devuelto

El mismo objeto

Descripcin

Nada puede ser agregado o removido de las propiedades establecidas de un objeto congelado. Cualquier intento de hacerlo fallar, ya sea de manera silenciosa o arrojando una excepcin TypeError (ms comunmente, pero no exclusivamente, en strict mode).

Los valores no pueden ser cambiados por propiedades de datos. Propiedades de acceso (getters y setters) funcionan igual (y an dan la ilusin de que estas cambiando el valor). Note que los valores que son objetos an pueden ser modificados, a menos que esten congelados tambien.

La funcin retorna el mismo objeto pasado en ella, no crea una copia congelada

Ejemplos

Congelando Objetos

js
var obj = {
  prop: function () {},
  foo: "bar",
};

// Nuevas propiedades pueden ser agregadas,
// propiedades existentes pueden cambiar o removerse
obj.foo = "baz";
obj.lumpy = "woof";
delete obj.prop;

// Ambos, el objeto pasado como argumento tanto como el que se regresa
// sern 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 silenciosa
obj.quaxxor = "the friendly duck"; // No agrega una nueva propiedad, de manera silenciosa

// ...y en modo estricto tal intento arrojar TypeErrors
function 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 arrojarn una excepcin...
Object.defineProperty(obj, "ohai", { value: 17 }); // arroja un TypeError
Object.defineProperty(obj, "foo", { value: "eit" }); // arroja un TypeError

// Es imposible cambiar un prototipo
// Estos ejemplos retornan un error TypeError
Object.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 congelacin es superficial).

js
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 funcin.
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; // undefined

Notas

En ES5, si el argumento pasado a este mtodo no es un objeto (un primitivo), entonces causar un TypeError. En ES6, un argumento no-objeto ser tratado como si fuera un objeto congelado cualquiera, simplemente lo regresa.

js
> Object.freeze(1)
TypeError: 1 is not an object // Cdigo ES5

> Object.freeze(1)
1                             // Cdigo ES6

Especificaciones

Specification
ECMAScript 2027 LanguageSpecification
# sec-object.freeze

Compatibilidad con navegadores

Mira tambin


Web Proxy Viewer  |  New URL  |  Original Page