Objetos

Categories:

Aunque vimos de manera general cómo crear y utilizar objetos. En ECMAScript podemos tener más control de los objetos y de sus propiedades.

Object.create

// var objeto = Object.create(objeto, propiedades);

var objeto = Object.create({}, {
  nombre: {
    value: "Mi primer objeto"
  }
});

var objeto = Object.create(objeto, descriptor);

Objeto: se puede utilizar cualquier objeto del cuál queramos utilizar el prototipo.

Descriptor: Objeto que contiene la descripción del / de los atributo(s) para el nuevo objeto. Al definir los atributos podemos especificar las propiedades que puede tener cada atributo:

Atributo

Descripción

value

Valor del atributo del objeto.

writable

(true | false). Define si se puede establecer el valor de la propiedad.

enumerable

(true | false). Define si la propiedad se muestra en algunos ciclos como for (var in ) {} y Object.keys

configurable

(true | false). Define si la propiedad se puede borrar (delete obj.prop) y si sus atributos pueden cambiar.

Nota:
Si no se especifican writable, enumerable, configurable el valor que van a tener es false. El valor de value, get, set (si no se especifican) va a ser undefined.

Object.defineProperty / Object.defineProperties

También podemos definir nuevas propiedades – o modificar existentes, si se permite – una vez que tenemos el objeto creado con defineProperty / defineProperties.

/*
Agregar la propiedad versión 
a un objeto definido.
*/

var mi_objeto = {
  nombre: "Objeto personalizado"
};
  
Object.defineProperty(mi_objeto, "version", {
  value: "0.1.1",
  writable: true
});
/*
Modificar la propiedad nombre
y asignar la propiedad version
para el objeto otro objeto. 
*/

var otro_objeto = {
  nombre: "foo"
};

Object.defineProperties(otro_objeto, {
  nombre: {
    value: "Otro objeto",
    writable: false
  }, 
  version: {
    value: "0.1.0",
    writable: false
  }
});

Object.isExtensible / Object.preventExtensions

Si queremos prevenir que al objeto se el agreguen propiedades podemos utilizar preventExtensions.
Para saber si podemos extender un objeto utilizamos isExtensible.

/*
Verificamos si el objeto "mi_objeto"
se puede extender. 
Si es así,  agregamos un atributo
extensible con valor true y puede
ser modificado. 
*/

if (Object.isExtensible(mi_objeto)) {
  Object.defineProperty(mi_objeto, "extensible", {
    value: true,
    writable: true
  });      
}

/*
En este caso prevenimos que se pueda
extender con preventExtension. 
 Verificamos si el objeto "otro_objeto"
se puede extender. 
En este caso no se puede extender
y no se va a interpretar el código 
de la ramificación
*/

Object.preventExtensions(otro_objeto);

if (Object.isExtensible(otro_objeto)) {
  Object.defineProperty(otro_objeto, "extensible", {
    value: true,
    writable: true
  });      
}

Object.isSealed / Object.seal

Si queremos que, además de prevenir que se extienda el objeto, únicamente los valores de las propiedades existentes que estén en modo de lectura se puedan configurar, sellamos el objeto con seal. Para conocer si un objeto está sellado utilizamos isSealed.

var sellar = {}
  
Object.defineProperties(sellar, {
 nombre: {
   value: "Sellado",
   writable: false, 
   configurable: false
 }, 
 version: {
   value: "0.1.0",
   writable: true,
   configurable: false
 }
});
  
Object.seal(sellar);  
console.log(Object.isSealed(sellar));  


sellar.version = "1.1.1";

console.log(sellar.version);

Object.isFrozen / Object.freeze

Si queremos tener un objeto “sólo de lectura”, que no se pueda extender y sus propiedades no se puedan actualizar ni configurar, lo congelamos. Para congelar un objeto podemos utilizar freeze o podemos definir cada una de sus propiedades en “modo lectura” (especificar que escriban y no se puedan configurar) y después prevenir que el objeto se pueda extender.

Para revisar si un objeto está congelado utilizamos isFrozen.

/*
Podemos congelar el objeto desde el momento en que lo 
estamos definiendo. 
*/

var congelado = Object.create({}, {
  version: {
    value: "1.0.0",
    writable: false, 
    configurable: false
  }
});

Object.preventExtensions(congelado);

console.log(Object.isFrozen(congelado));

/*

Podemos congelarlo utilizando Object.freeze
*/

Object.freeze(otro_objeto);  

console.log(Object.isFrozen(otro_objeto));

Estas propiedades están disponibles desde IE9+.