Object.freeze()

Este articulo necesita una revisión técnica. Cómo puedes ayudar.

Este articulo necesita una revisión editorial. Cómo puedes ayudar.

Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.

El método Object.freeze() congela un objeto: es decir, previene que nuevas propiedades sean agregadas; privene que las propiedades existentes sean eliminadas; y previene que las propiedades existentes, o su capacidad de enumeración, configuración, o escritura. de ser cambiadas. En escencia el objeto es hecho efectivamente inmutable. El método regresa el objeto congelado.

Sintáxis

Object.freeze(obj)

Parametros

obj
El objeto a congelar.

Descripción

Nada puede ser agregado o removido de las propiedades establecidas de un objeto congelado. Cualuier intento de hacerlo fallará, ya sea de manera silenciosa o arrojando una excepción TypeError (más comunmente, pero no exclusivamente, en strict mode).

Los valores no pueden ser cambiado por propiedades de datos. Propiedades de acceso (getters y setters) 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 esten congelados tambien.

Ejemplos

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
// 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 silenciosa
obj.quaxxor = 'the friendly duck'; // No agrega una nueva propiedad, de manera silenciosa

// ...y en modo estrico 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 arrojarán una excepción...
Object.defineProperty(obj, 'ohai', { value: 17 }); // arroja un TypeError
Object.defineProperty(obj, 'foo', { value: 'eit' }); // arroja un TypeError

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; // undefined

Notas

En ES5, si el argumento pasado a este método 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.

> Object.freeze(1)
TypeError: 1 is not an object // Código ES5

> Object.freeze(1)
1                             // Código ES6

Especificaciones

Specification Status Comment
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.freeze' in that specification.
Standard Definición inicial. Implementado en JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.freeze' in that specification.
Standard  

Compatibilidad de navegadores

Caracteristica Firefox (Gecko) Chrome Internet Explorer Opera Safari
Soporte básico 4.0 (2) 6 9 12 5.1
Caracteristica Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
Soporte básico ? ? ? ? ?

Mira también

Etiquetas y colaboradores del documento

 Colaboradores en esta página: tw1ttt3r, mishelashala
 Última actualización por: tw1ttt3r,