Programación Orientada a Objetos

Crear objetos de forma manual está bien cuando necesitas uno o dos, pero cuando el proyecto exige cientos de ellos, copiar y pegar deja de ser una opción viable. Las funciones constructoras en JavaScript resuelven exactamente ese problema: permiten fabricar objetos de manera escalable, reutilizable y organizada.

¿Qué es un objeto?

Un objeto es una estructura de datos que permite agrupar información relacionada en una sola unidad. Cada pieza de información se guarda como una propiedad, usando una clave y un valor. Por ejemplo, un usuario puede tener un nombre, una edad y una profesión, todo dentro del mismo objeto.

  • Clave: nombre de la propiedad
  • Propiedad / Atributos : clave + valor
  • Metódos : Acciones que pertenecen al objeto
//Sintaxis

const objeto = {
  clave: valor,
  clave2: valor2,
};

¿Cómo se usa comúnmente?

const user = {
  name: "Ana",
  age: 20,
  isStudent: true,
};

¿Para qué sirve?

  • Guardar información relacionada
  • Representar cosas del mundo real (usuarios,productos,etc.)
  • Organizar datos de forma clara
  • Muy usado en frontend (APIs, React,etc)

Condiciones de uso

  • Las claves (keys) suelen ser strings
  • Los valores pueden ser: string, numbers, boolean, array, otro objeto, funciones

Formas de acceder o modificar valores

Notación punto

  user.name  

Notación de corchetes

user['age']

Modificar valores

user.age = 21

Agregar propiedades

user.country = 'Colombia'

Métodos en un objeto

 ⁉️ Un metódo es una función dentro de un objeto. Es una acción que ese objeto puede hacer.

const user = {
  propiedad: valor,
  metodo() {
    //código
  },
}

//¿Como usarlo?
user.metodo()

¿Para qué sirve?

  • Darle comportamiento a un objeto
  • Trabajar con sus propios datos
  • Siular cosas reales
  • Es una función dentro del objeto
  • Puedes usar this para acceder a sus propiedades
    • 👉 this significa: “este objeto” es para hacer referencia al valor de una propiedad dentro del mismo objeto
const user = {
  name: 'Ana',
  greet() {
    return `Hola , soy ${this.name}`
  },
  setAge(newAge) {
    this.age = newAge
  },
}

Eliminar propiedades de un objeto

⁉️ Elimina una propiedad (clave + valor) de un objeto. Esto es mediante al operador propio de JavaScript delete. Este no es un método

const user = {
  name: 'Ana',
  age: 20,
}

delete user.age

Función constructora

Una función constructora es, en esencia, una función cuyo único propósito es construir objetos y así poder hacer el proceso mas corto y rapido. Su sintaxis es la misma que la de cualquier función, con ciertas diferencias importantes:

  • El nombre de la función inicia con mayúsculas(por convención).
  • Dentro del cuerpo se utiliza la palabra reservada this para acceder a las propiedades del objeto que se está construyendo.
  • La palabra reservada new se utiliza para crear un nuevo objeto.

Necesitamos saber que es una instancia. Una instancia es una clase de objeto creado a partir de una clase o constructor.

function Person(name,lastName,age){
  this.name = name;
  this.lastName = lastName;
  this.age = age;
}   /*↳ Usamos la palabra reservada this para acceder
 a las propiedades del objeto que se está construyendo*/

/* ↓ Esto es una instancia. */
const person1 = new Person("Gabriela", "Ferrer",26);
/* ↳ Usamos la palabra reservada new para
crear un nuevo objeto y llamar a la función constructora*/

¿Para qué sirve prototype en una función constructora?

Después de definir la función constructora, es probable que necesites agregar nuevas propiedades o métodos sin modificar el constructor original. Aquí es dond entra en juego prototype.

El prototype es un objeto especial que actúa como una copia compartida de la función constructora.Todo lo que agregues al prototype estará disponible para todas las instancias de ese objeto.

Nota: Una instancia es simplemente el objeto resultante de ejecutar tu función constructora con la palabra reservada new. Es la “copia” única y específica que nace de ese molde.

Person.prototype.cellPhone = "123456789";
↳ /* Esta propiedad estará disponible para todas las instancias de Person*/

Ⓜ️Person.prototype.saludar= function(){ // los metodos se añaden a partir de prototype
  console.log(`¡Hola! me llamo ${this.name}`)
}
/*Podemos hace los mismo para agregar métodos*/

¿Por qué usar .prototype en lugar de declararlo dentro de la función constructora?

  • Eficiencia de memoria: Si defines el método directamente con this.miMetodo = function() dentro de la función constructora, se creará una copia nueva de esa función en la memoria cada vez que crees un objeto nuevo.

  • Uso compartido: Al añadirlo a Persona.prototype, todas las instancias (persona1, persona2, etc.) consultan un único lugar en la memoria para ejecutar ese método.

Agregar una propiedad a una unica instancia

person1.nationality = "Colombian";
↳ /* Esta propiedad estará disponible unicamente para la instancia person1*/

Clases en JavaScript

Las clases son la forma más moderna nacida en 2015, para crear objetos en JavaScript con una sintaxis más limpia.

Una clase funciona como un blueprint, es decir, un molde a partir del cual vas a construir diferentes objetos con la misma estructura. No es una característica completamente nueva del lenguaje: es lo que se conoce como sugar syntax, una capa más amigable encima de las funciones constructoras que ya existían.

¿Qué es sugar syntax? Es una sintaxis más legible que hace lo mismo que el código original por debajo. En este caso, las clases siguen creando objetos como las funciones constructoras, pero se leen mejor.

//Sintaxis  

class User {
  constructor (name, age){
    this.name = name;
    this.age= age;
  }           
  saludar(){ 
    console.log(`¡Hola! me llamo ${this.name}`)
  }/*Los métodos en una clase son funciones que
   describen acciones que pueden realizar sus instancias.*/
}

const ana = new User("Ana", 24);
ana.name // Este retorna el valor de la llave Ana
ana.saludar();

Diferencias entre clases y funciones constructoras

CaracterísticaFunción constructoraClase
¿Qué es?Una función usada como molde para crear objetos.Una sintaxis moderna para crear objetos.
¿Para qué sirve?Crear múltiples objetos con una estructura similar.Crear múltiples objetos de forma más organizada.
¿Cómo se crea?Se utiliza function y new.Se utiliza class y new.
ConstructorLa propia función actúa como constructor.Se utiliza constructor().
MétodosSe suelen agregar al prototype.Se escriben directamente dentro de la clase.
Sintaxisfunction User(name) { ... }class User { ... }
Usonew User("Ana")new User("Ana")
PrototiposUtiliza el sistema de prototipos de JavaScript.También utiliza prototipos internamente.

Herencia y prototipos

Ejemplo de prototipo en las clases

Prototipo: Cada clase o función constructora genera un prototipo que comparte propiedades y métodos a sus instancia, lo que te permite escribir código más limpio, reutilizable y organizado.

Ejemplo de prototipo en las clases

Herencia: La herencia en JavaScript ocurre de forma automática gracias al prototipo. Cuando defines un método en la clase constructora, ese método queda disponible para cualquier instancia que crees después.