Objetos en JavaScript

Objetos en JavaScript


Objetos en JavaScript: La Piedra Angular del Lenguaje Los objetos son una parte fundamental de JavaScript. Son estructuras de datos flexibles y poderosas que permiten almacenar colecciones de datos y funcionalidades relacionadas. En este artículo, exploraremos en profundidad los objetos en JavaScript, desde lo básico hasta características más avanzadas.

1. Creación de Objetos

Hay varias formas de crear objetos en JavaScript:

Notación Literal de Objeto

let persona = {
  nombre: "Ana",
  edad: 30,
  saludar: function() {
    console.log("Hola, soy " + this.nombre);
  }
};`

Constructor de Objeto

let persona = new Object();
persona.nombre = "Ana";
persona.edad = 30;
persona.saludar = function() {
  console.log("Hola, soy " + this.nombre);
};

Función Constructora

function Persona(nombre, edad) {
  this.nombre = nombre;
  this.edad = edad;
  this.saludar = function() {
    console.log("Hola, soy " + this.nombre);
  };
}

let persona = new Persona("Ana", 30);

2. Propiedades y Métodos

Las propiedades son los datos almacenados en un objeto, mientras que los métodos son funciones asociadas a un objeto.

let coche = {
  marca: "Toyota",
  modelo: "Corolla",
  año: 2020,
  arrancar: function() {
    console.log("El coche está arrancando");
  }
};

console.log(coche.marca); // "Toyota"
coche.arrancar(); // "El coche está arrancando"

3. Acceso a Propiedades

Hay dos formas principales de acceder a las propiedades de un objeto:

Notación de Punto

console.log(coche.modelo); // "Corolla"

Notación de Corchetes

console.log(coche["modelo"]); // "Corolla"

4. Propiedades Dinámicas

Puedes agregar, modificar o eliminar propiedades de un objeto en cualquier momento:

coche.color = "rojo"; // Agregar
coche.año = 2021; // Modificar
delete coche.modelo; // Eliminar

5. Métodos de Objeto

JavaScript proporciona varios métodos útiles para trabajar con objetos:

Object.keys() Devuelve un array con las claves enumerables de un objeto.

console.log(Object.keys(coche)); // ["marca", "año", "arrancar", "color"]
Object.values()

Devuelve un array con los valores de las propiedades enumerables de un objeto.

console.log(Object.values(coche)); // ["Toyota", 2021, [Function: arrancar], "rojo"]
Object.entries()

Devuelve un array de arrays, donde cada subarray es un par [clave, valor] del objeto.

console.log(Object.entries(coche));
// [["marca", "Toyota"], ["año", 2021], ["arrancar", [Function: arrancar]], ["color", "rojo"]]

6. Prototipos y Herencia

JavaScript utiliza prototipos para implementar la herencia. Cada objeto tiene un enlace interno a otro objeto llamado su prototipo. Este prototipo objeto tiene a su vez su propio prototipo, y así sucesivamente, formando lo que se conoce como la cadena de prototipos.

Creación de objetos con prototipos

let animalProto = {
  comer: function() {
    console.log("Ñom ñom");
  }
};

let perro = Object.create(animalProto);
perro.ladrar = function() {
  console.log("Guau guau");
};

perro.comer(); // "Ñom ñom"
perro.ladrar(); // "Guau guau"

Herencia con funciones constructoras

function Animal(nombre) {
  this.nombre = nombre;
}

Animal.prototype.comer = function() {
  console.log(this.nombre + " está comiendo.");
};

function Perro(nombre) {
  Animal.call(this, nombre);
}

Perro.prototype = Object.create(Animal.prototype);
Perro.prototype.constructor = Perro;

Perro.prototype.ladrar = function() {
  console.log(this.nombre + " está ladrando.");
};

let miPerro = new Perro("Fido");
miPerro.comer(); // "Fido está comiendo."
miPerro.ladrar(); // "Fido está ladrando."

7. Getters y Setters

Los getters y setters permiten definir cómo se accede y modifica una propiedad de un objeto.

let persona = {
  nombre: "Juan",
  apellido: "Pérez",
  get nombreCompleto() {
    return this.nombre + " " + this.apellido;
  },
  set nombreCompleto(valor) {
    [this.nombre, this.apellido] = valor.split(" ");
  }
};

console.log(persona.nombreCompleto); // "Juan Pérez"
persona.nombreCompleto = "María López";
console.log(persona.nombre); // "María"
console.log(persona.apellido); // "López"

8. Object.defineProperty()

Este método permite definir nuevas propiedades o modificar las existentes con un control más fino sobre sus atributos.

let obj = {};

Object.defineProperty(obj, 'propiedad', {
  value: 42,
  writable: false,
  enumerable: true,
  configurable: true
});

console.log(obj.propiedad); // 42
obj.propiedad = 77; // No tiene efecto debido a writable: false
console.log(obj.propiedad); // 42

9. Métodos de Object.prototype

Estos métodos están disponibles para todos los objetos en JavaScript:

hasOwnProperty() Comprueba si una propiedad es propia del objeto y no heredada.

console.log(persona.hasOwnProperty('nombre')); // true
console.log(persona.hasOwnProperty('toString')); // false

toString() Devuelve una representación en cadena del objeto.

console.log(persona.toString()); // "[object Object]"

10. Desestructuración de Objetos

La desestructuración permite extraer valores de objetos y asignarlos a variables de forma más concisa.

let {nombre, edad} = persona;
console.log(nombre); // "María"
console.log(edad); // 30

Conclusión

Los objetos son fundamentales en JavaScript, ofreciendo versatilidad y potencia para estructurar código y datos. Dominarlos es esencial para desarrollar aplicaciones eficientes y escalables. Con su capacidad para encapsular propiedades y métodos, implementar herencia y crear abstracciones complejas, los objetos son la base de la programación moderna en JavaScript. Su comprensión profunda abre puertas a patrones de diseño avanzados y mejora significativamente la calidad del código.