Entendiendo los Objetos en JavaScript

Los objetos son, una de las características menos entendidas en JavaScript, dado que su implementación tiene algunas diferencias importantes con muchos lenguajes de programación más tradicionales.

Vayamos paso a paso, intentando entenderlos.

Nota: Este contenido lo publiqué primero en mi newsletter, la semana después de publicar el newsletter publico en mi blog, si quieres ser el primero en leer suscríbete.

En palabras simples:

Los objetos son una colección de propiedades

Para construir objetos podemos hacerlo de dos maneras,

  • Objetos declarativos o literales: podemos crear objetos sin necesidad de un constructor o instanciar una clase, para esto solo declaramos el objeto y sus propiedades.
  • Objetos construidos: JavaScript es un lenguaje libre de clases, pero tenemos el keyword new, el cual nos permite crear un nuevo objeto, de esta manera podemos utilizar una función que cumpla el rol del constructor.

Contenido

JavaScript no almacena el contenido de las propiedades dentro de los objetos, este solo guarda el nombre de las propiedades, con referencias a donde están almacenados los valores.

Acceder a propiedades

Para acceder a las propiedades tenemos dos opciones

  • notación con .
  • notación con []

Atributos de las propiedades

Cada una de las propiedades tiene 4 atributos, los cuales son

  • value
  • configurable
  • enumerable
  • writable

Para poder ver los atributos usamos Object.getOwnPropertyDescriptor(target, propiedad)

Sabiendo esto podremos ver nuestro objetos representados como

Establecer atributos

Para setear nuevas propiedades con atributos personalizados utilizamos Object.defineProperty(myObj, propiedad, {atributos})

Veamos cada uno de estos atributos y entendamos mejor a que hacen referencia.

Writable

Nos permite definir si el valor de una propiedad va a poder ser modificado o no.

Configurable

Nos permite definir si los atributos de la propiedad van a poder ser modificados.

Enumerable

Controla si la propiedad va a ser mostrada cuando se enumeren las propiedades del objeto, como usando for..in

Metodos utiles

  • Object.preventExtensions(objeto) recibe un objeto y retorna un objeto al cual no se pueden agregar nuevas propiedades.
  • Object.seal(objeto) recibe un objeto y retorna un objeto al cual no se le pueden agregar propiedades, ni configurar las existentes
  • Object.freeze(Objeto) recibe un objeto y retorna uno al cual, no se puede agregar propiedades, modificarlas, o sobrescribir las actuales

Los objetos en JavaScript son entidades dinámicas que se pueden modificar en cualquier punto, esto aunque es una característica poderosa, no siempre la vamos a querer.

Aplicando los métodos que anteriores vamos a poder llegar a tener objetos inmutables, pero si tuviéramos otros objetos como propiedades, estos no aplican esta inmutabilidad, podríamos crear una función recursiva, que vuelva todas las propiedades de nuestros objetos inmutables o utilizas librerías como immutable.js .