Object: Extensibilidad

Los objetos pueden ampliarse añadiendole nuevas propiedades y métodos mediante expresiones. A veces esto no es deseable, y Object provee mecanismos para bloquear la extensibilidad de un objeto.

Object.preventExtensions(obj)
Es la menos estricta, solo bloquea para que no se puedan añadir propiedades o métodos, pero los que ya existen son modificables. Es aplicable tanto a instancias de objetos como a constructores. Mediante Object.isExtensible() podemos verificar si el objeto admite o no nuevas porpiedades.
Object.seal(objeto)
Este método es más drástico porque ademas de impedir crear nuevas propiedades o métodos, bloquea los que ya existen de manera que no pueden reconfigurarse. No es recursivo, es decir si el objeto contine otro objeto este no es afectado por el bloqueo. Mediante Object.isSealed() podemos verificar si el objeto está bloqueado
Object.freeze()
El más estrico de todos. Deja el objeto congelado, es decir: ni se pueden añadir, ni reconfigurar ni cambiar valores de las propiedades o metodos del objeto afectado. La propiedad prototype puede modificarse directamente, pero no a través del método setPrototype, para evitar esto se debe congelar igualmente la prpiedad prototype del objeto. Mediante Object.isFrozen() podemos verificar si el objeto admite está totalmente bloqueado.

Todos estos métodos son irreversibles, una vez aplicados no pueden cancelarse. Y salvo que en el programa se use el modo estricto, al intentar una operación bloqueada no se produce ningún error.

Veamos algunos ejemplos de uso

"use strict";

var pedido;

pedido = { frutas:"Manzanas", carne: "Pollo", pescado:"Atún"};

Object.preventExtensions(pedido)

pedido.

pedido.bebida = "Agua"   //salta el error

 

En este ejemplo el objeto pedido se bloquea para no permitir nuevas propiedades. Si se usa el modo estricto saltará un aviso de error, en modo normal no habrá aviso, pero la proiedad tampoxo se añadirá. El bloqueo no evita que se pueda borrar una propiedad, usando el método global delete(obj.clave)

Si se quiere un bloque más exigente usamos el método Object.seal(objeto)

"use strict";

var pedido;

pedido = { frutas:"Manzanas", carne: "Pollo", pescado:"Atún"};

Object.seal(pedido)

pedido.frutas = "Plátanos";

delete(pedido.frutas);     //Salta el error por el borrado

 

Uso el modo estricto para evidenciar el efecto de este método, ahora tampoco no se puede modificar la propiedad, al intentar borrarla salta el error. Si no estamos en modo estricto no salta el error, pero no se produce el cambio.

Si queremos que el objeto no pueda modificarse en absoluto se usa el método Object.freeze(), ni se pueden añadir o modificar la propiedades ni valores. El objeto es intocable, es un objeto de solo lectura.

"use strict";

var pedido;

pedido = { frutas:"Manzanas", carne: "Pollo", pescado:"Atún"};

Object.freeze(pedido);

pedido.frutas = "Plátanos"; //Salta el error

En este ejemplo el error salta en cualquier modificación que se intente, incluso al cambiar un valor.