Object.seal()

El método Object.seal() sella un objeto, previniendo que puedan añadirse nuevas propiedades al mismo, y marcando todas las propiedades existentes como no-configurables. Los valores de las propiedades presentes permanecen pudiendo cambiarse en tanto en cuanto dichas propiedades sean de escritura.

Sintaxis

Object.seal(obj)

Parámetros

obj
El objeto que ha de ser sellado.

Descripción

Por defecto, los objetos son extensibles (pueden añadirse nuevas propiedades a los mismos). Sellar un objeto previene que nuevas propiedades puedan ser añadidas y marca todas las propiedades existentes como no-configurables. Esto tiene el efecto de hacer fijo e inmutable el juego de propiedades del objeto. Al hacer todas las propiedades no-configurables previene también que se puedan convertir propiedades de datos en propiedades de acceso y viceversa, pero no evita que los valores de las propiedades de datos puedan ser modificados. Intentar eliminar o añadir propiedades a un objeto sellado, o convertir una propiedad de datos en una propiedad de acceso fallará, bien silenciadamente o bien produciendo un TypeError (más frecuentemente, aunque no exclusivamente, con código en modo estricto).

La cadena de prototiado permanece inalterada. No obstante, la propiedad __proto__ es también sellada.

Retorna una referencia al Objeto pasado.

Ejemplos

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

// Pueden añadirse nuevas propiedades, propiedades existentes pueden cambiarse o eliminarse.
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;

var o = Object.seal(obj);

o === obj; // true
Object.isSealed(obj); // === true

// Sigue permitido modificar valores de propiedades en un objeto sellado.
obj.foo = 'quux';

// Pero no puedes convertir propiedades de datos en propiedades de acceso, ni viveversa
Object.defineProperty(obj, 'foo', { get: function() { return 'g'; } }); // produce un TypeError

// Ahora, cualquier cambio que no sea modificar valores de propiedades fallará
obj.quaxxor = 'the friendly duck'; // silenciosamente, no añadirá la propiedad
delete obj.foo; // silenciosamente, no eliminará la propiedad

// ...y en modo estricto esos intentos producirán TypeErrors.
function fail() {
  'use strict';
  delete obj.foo; // genera un TypeError
  obj.sparky = 'arf'; // genera un TypeError
}
fail();

// Intentar añadir propiedades mediante Object.defineProperty también fallará.
Object.defineProperty(obj, 'ohai', { value: 17 }); // genera un TypeError
Object.defineProperty(obj, 'foo', { value: 'eit' }); // cambia el valor exisitente

Notas

En ES5, si el argumento de este método no es un objeto (una primitiva), se generará un TypeError. En ES6, un argumento no-objeto será tratado como si se sellase un objeto ordinario, símplemente retornándolo.

Object.seal(1);
// TypeError: 1 no es un objeto (código ES5)

Object.seal(1);
// 1                             (código ES6)

Especificaciones

Especificación Estado Observaciones
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.seal' in that specification.
Standard Definición inicial. Implementado en  JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.seal' in that specification.
Standard  
ECMAScript 2017 Draft (ECMA-262)
The definition of 'Object.seal' in that specification.
Draft  

Compatibilidad con navegadores

Prestación Chrome Firefox (Gecko) Internet Explorer Opera Safari
Soporte básico 6 4.0 (2.0) 9 12 5.1
Prestiación Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Soporte básico ? ? ? ? ? ?

Ver también

Etiquetas y colaboradores del documento

 Última actualización por: JoniJnm,