Los Objetos
En JavaScript, un objeto es una estructura de datos que permite almacenar múltiples valores como pares clave-valor. Los objetos son fundamentales en JavaScript porque te permiten organizar y manipular datos complejos de manera eficiente.
1. Qué es un objeto? #
Un objeto en JavaScript es como una caja que contiene propiedades. Cada propiedad tiene un nombre (o clave) y un valor. Estos valores pueden ser de cualquier tipo: números, cadenas de texto, funciones, o incluso otros objetos.
¿Cómo se crea un objeto? #
Puedes crear un objeto usando llaves {}. Dentro de las llaves, defines las propiedades con pares clave-valor.
Ejemplo de un objeto simple:
1let persona = { 2 nombre: "Juan", 3 edad: 30, 4 esEstudiante: true 5};
En este ejemplo:
"nombre"es una propiedad con el valor"Juan"."edad"es una propiedad con el valor30."esEstudiante"es una propiedad con el valortrue.
¿Cómo acceder a las propiedades de un objeto? #
Hay dos maneras principales de acceder a las propiedades de un objeto:
-
Usando la notación de punto:
- Se usa un punto (
.) seguido del nombre de la propiedad. - Ejemplo:
1let persona = { 2 nombre: "Juan", 3 edad: 30, 4 esEstudiante: true 5}; 6console.log(persona.nombre); // Muestra "Juan" 7console.log(persona.edad); // Muestra 30Salida de consola Juan 30
- Se usa un punto (
-
Usando la notación de corchetes:
- Se usan corchetes
[]y el nombre de la propiedad entre comillas. - Es útil si el nombre de la propiedad está en una variable o si tiene caracteres especiales.
- Ejemplo:
1let persona = { 2 nombre: "Juan", 3 edad: 30, 4 esEstudiante: true 5}; 6console.log(persona["nombre"]); // Muestra "Juan" 7console.log(persona["edad"]); // Muestra 30Salida de consola Juan 30
- Se usan corchetes
¿Cómo agregar o modificar propiedades? #
Puedes agregar una nueva propiedad o modificar una existente simplemente asignándole un valor usando la notación de punto o de corchetes.
Agregar o modificar propiedades:
1let persona = { 2 nombre: "Juan", 3 edad: 30, 4 esEstudiante: true 5}; 6persona.apellido = "Pérez"; // Agrega una nueva propiedad "apellido" 7persona.edad = 31; // Modifica la propiedad "edad" 8console.log(persona);Salida de consola { nombre: 'Juan', edad: 31, esEstudiante: true, apellido: 'Pérez' }
¿Cómo eliminar propiedades? #
Puedes eliminar una propiedad de un objeto usando el operador delete.
Eliminar una propiedad:
1let persona = { 2 nombre: "Juan", 3 edad: 30, 4 esEstudiante: true 5}; 6delete persona.esEstudiante; // Elimina la propiedad "esEstudiante" 7console.log(persona);Salida de consola { nombre: 'Juan', edad: 31, }
Métodos en objetos #
Un método es una función que se define como una propiedad dentro de un objeto. Los métodos permiten que un objeto realice acciones.
Ejemplo de objeto con un método:
1let coche = { 2 marca: "Toyota", 3 modelo: "Corolla", 4 arrancar: function() { 5 console.log("El coche ha arrancado"); 6 } 7}; 8 9coche.arrancar(); // Llama al método "arrancar"Salida de consola El coche ha arrancado
En este ejemplo, "arrancar" es un método del objeto coche.
Objetos anidados #
Un objeto puede contener otros objetos dentro de él, lo que se llama objetos anidados.
Ejemplo de objeto anidado:
1let usuario = { 2 nombre: "Ana", 3 direccion: { 4 calle: "Calle Falsa 123", 5 ciudad: "Madrid" 6 } 7}; 8 9console.log(usuario.direccion.ciudad); // Muestra "Madrid"Salida de consola Madrid
2. Copia y Clonación de Objetos: Superficial vs Profunda #
En JavaScript, los objetos se pasan y asignan por referencia. Si deseas duplicar un objeto sin modificar el original, existen dos enfoques:
A) Copia Superficial (Shallow Copy): Spread ({...obj}) y Object.assign() #
Copia únicamente las propiedades de primer nivel. Si el objeto contiene objetos o arrays anidados, estos seguirán compartiendo la misma referencia en memoria:
1const original = { nombre: "Ana", datos: { edad: 25 } }; 2const copiaSuperficial = { ...original }; 3 4copiaSuperficial.datos.edad = 30; // ⚠️ ¡Modifica también al original! 5console.log(original.datos.edad); // 30
B) Copia Profunda (Deep Copy): structuredClone() (Estándar Moderno) #
La función nativa global structuredClone() clona recursivamente el objeto completo, duplicando todas las estructuras anidadas y preservando tipos complejos (fechas Date, Map, Set, RegExp y referencias circulares):
1const usuarioOriginal = { 2 nombre: "Beatriz", 3 hobbies: ["programar", "leer"], 4 creado: new Date(), 5}; 6 7const clonProfundo = structuredClone(usuarioOriginal); 8clonProfundo.hobbies.push("escalada"); 9 10console.log("Original:", usuarioOriginal.hobbies); 11console.log("Clon:", clonProfundo.hobbies);Salida de consola Original: [ 'programar', 'leer' ] Clon: [ 'programar', 'leer', 'escalada' ]
3. Métodos de Utilidad del Objeto Global Object #
| Método | Utilidad |
|---|---|
Object.keys(obj) | Devuelve un array con los nombres de las propiedades. |
Object.values(obj) | Devuelve un array con los valores. |
Object.entries(obj) | Devuelve un array de pares [clave, valor]. |
Object.fromEntries(entries) | Reconstruye un objeto a partir de un array de pares [clave, valor]. |
Object.hasOwn(obj, 'prop') (ES2022) | Comprobación segura y recomendada de existencia de propiedad (sustituye a obj.hasOwnProperty). |
1const producto = { id: 101, titulo: "Portátil", precio: 899 }; 2 3console.log(Object.hasOwn(producto, "precio")); // true 4console.log(Object.entries(producto));Salida de consola true [ [ 'id', 101 ], [ 'titulo', 'Portátil' ], [ 'precio', 899 ] ]
Resumen del tema
Conceptos clave #
- Estructura Clave-Valor: colecciones dinámicas de propiedades y métodos en memoria (manejadas por referencia).
- Acceso: notación por punto (
obj.prop) o corchetes (obj['prop']). - Clonación:
- Superficial:
{...obj}uObject.assign({}, obj). - Profunda:
structuredClone(obj)para clonar recursivamente estructuras complejas sin alterar referencias originales.
- Superficial:
- Inspección:
Object.keys(),Object.values(),Object.entries(),Object.fromEntries()yObject.hasOwn().
Qué debes recordar #
Usa structuredClone() para clonar objetos anidados de forma profunda y segura, y Object.hasOwn() para comprobar la presencia de propiedades.