Object.seal()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
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 Object.prototype.__proto__
Obsoleto
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
Specification |
---|
ECMAScript Language Specification # sec-object.seal |
Compatibilidad con navegadores
BCD tables only load in the browser