Programación orientada a objetos en JavaScript

JavaScript

Por Editorial | 2036 vistas | Lectura de 6 minutos

La POO en JavaScript brinda un enfoque sólido para construir aplicaciones de calidad y fomentar la reutilización de código en tus proyectos.

foto de Programación orientada a objetos en JavaScript

La Programación Orientada a Objetos (POO) es un paradigma de programación ampliamente utilizado que permite organizar el código de manera más estructurada y reutilizable. Si estás interesado en aprender a programar o expandir tus conocimientos en JavaScript, la POO es un concepto clave que debes dominar.

La base de la POO en JavaScript

La POO en JavaScript se basa en la creación de clases, que son plantillas para la creación de objetos. Las clases se definen utilizando la sintaxis de la declaración de clase introducida en ECMAScript 2015.

En este ejemplo, creamos una clase llamada Persona. La clase tiene un constructor que acepta dos parámetros: nombre y edad. Estos parámetros nos permiten establecer el nombre y la edad de cada instancia de la clase.

class Persona {
  constructor(nombre, edad) {
    this.nombre = nombre
    this.edad = edad
  }

  saludar() {
    console.log(`Hola, mi nombre es ${this.nombre} y tengo ${this.edad} años.`)
  }
}

El constructor de la clase asigna los valores de los parámetros a las propiedades correspondientes de la instancia utilizando la sintaxis this.nombre = nombre y this.edad = edad.

Además del constructor, la clase Persona también tiene un método llamado saludar(). Este método muestra un mensaje por consola utilizando los valores de las propiedades nombre y edad de la instancia.

const persona1 = new Persona("Juan", 25)
persona1.saludar() // ¡Hola! Mi nombre es Juan y tengo 25 años.

const persona2 = new Persona("María", 30)
persona2.saludar() // ¡Hola! Mi nombre es María y tengo 30 años.

En el ejemplo anterior, creamos dos instancias de la clase Persona utilizando el operador new. Luego, llamamos al método saludar() en cada instancia, lo que muestra un mensaje personalizado en la consola con el nombre y la edad de cada persona.

La clase Persona es un ejemplo básico de cómo crear una estructura de objeto reutilizable en JavaScript. A medida que avances en tu conocimiento de JavaScript, podrás agregar más propiedades y métodos a la clase para expandir su funcionalidad y hacerla aún más útil en tus aplicaciones.

Herencia

La herencia permite crear jerarquías de clases y compartir características comunes. En JavaScript, puedes lograr la herencia utilizando la palabra clave extends.

Por ejemplo, podemos crear una clase Estudiante que herede de la clase Persona:

class Estudiante extends Persona {
  constructor(nombre, edad, grado) {
    super(nombre, edad)
    this.grado = grado
  }

  estudiar() {
    console.log(`${this.nombre} está estudiando en ${this.grado}.`)
  }
}

La clase Estudiante hereda todas las propiedades y métodos de la clase Persona. En el constructor de la clase Estudiante, utilizamos la palabra clave super para llamar al constructor de la clase Persona y pasar los parámetros correspondientes.

Además de heredar las propiedades y métodos de la clase Persona, la clase Estudiante agrega una nueva propiedad llamada grado y un método llamado estudiar(). La propiedad grado nos permite almacenar el nivel de estudios del estudiante, mientras que el método estudiar() muestra un mensaje indicando que el estudiante está estudiando en su respectivo grado.

const estudiante1 = new Estudiante("Juan", 20, "Universidad")
estudiante1.saludar() // ¡Hola! Mi nombre es Juan y tengo 20 años.
estudiante1.estudiar() // Juan está estudiando en Universidad.

const estudiante2 = new Estudiante("María", 18, "Escuela Secundaria")
estudiante2.saludar() // ¡Hola! Mi nombre es María y tengo 18 años.
estudiante2.estudiar() // María está estudiando en Escuela Secundaria.

En el ejemplo anterior, creamos instancias de la clase Estudiante utilizando el constructor de la clase. Al llamar a los métodos heredados como saludar() y al método específico de la clase Estudiante como estudiar(), obtenemos resultados personalizados que muestran la información del estudiante y su actividad actual.

La herencia nos permite reutilizar el código y agregar funcionalidades adicionales en las clases derivadas, lo que mejora la organización y la eficiencia de nuestro código.

Encapsulamiento

El encapsulamiento permite proteger los datos y ocultar su implementación interna. En JavaScript, puedes utilizar una convención de nomenclatura o técnicas de encapsulamiento para indicar que el atributo es privado, pero el acceso no será restringido.

Por ejemplo, podrías nombrar la variable como _saldo para indicar que es un miembro privado, aunque no esté técnicamente protegido de accesos externos.

class CuentaBancaria {
  constructor() {
    this._saldo = 0
  }

  depositar(cantidad) {
    this._saldo += cantidad
  }

  retirar(cantidad) {
    if (cantidad <= this._saldo) {
      this._saldo -= cantidad
    } else {
      console.log("Saldo insuficiente.")
    }
  }

  obtenerSaldo() {
    return this._saldo
  }
}

let cb = new CuentaBancaria()

cb.depositar(1500)
cb.retirar(1000)

console.log(cb.obtenerSaldo()) // 500

En este caso, el uso del prefijo _ en this._saldo indica que es un miembro privado, pero es importante destacar que esto no impide el acceso directo desde fuera de la clase. Es una convención de nomenclatura utilizada para indicar que el atributo es considerado como privado y se espera que se acceda a través de los métodos públicos de la clase.

Polimorfismo

En JavaScript, podemos lograr el polimorfismo utilizando la técnica de sobreescritura de métodos, es una característica de la herencia que nos permite redefinir un método en una clase derivada para proporcionar una implementación específica.

Cuando una clase derivada tiene un método con el mismo nombre que un método en la clase base, el método de la clase derivada reemplaza al de la clase base. Esto significa que al llamar al método en un objeto de la clase derivada, se ejecutará la implementación específica de esa clase, en lugar de la implementación de la clase base.

class Animal {
  hacerSonido() {
    console.log("El animal hace un sonido.")
  }
}

class Perro extends Animal {
  hacerSonido() {
    console.log("El perro ladra: ¡Guau, guau!")
  }
}

class Gato extends Animal {
  hacerSonido() {
    console.log("El gato maulla: ¡Miau, miau!")
  }
}

const animal1 = new Perro()
const animal2 = new Gato()

animal1.hacerSonido() // El perro ladra: ¡Guau, guau!
animal2.hacerSonido() // El gato maulla: ¡Miau, miau!

En el ejemplo anterior, hemos definido la clase base Animal y las clases derivadas Perro y Gato. Ambas clases derivadas tienen su propia implementación del método hacerSonido(). Cuando creamos instancias de las clases Perro y Gato y llamamos al método hacerSonido(), se ejecutará la implementación correspondiente de cada clase.

Este comportamiento de sobreescritura de métodos nos permite lograr el polimorfismo, ya que podemos tratar los objetos de las clases derivadas como objetos de la clase base y llamar a los métodos correspondientes, y la ejecución se realizará de manera polimórfica, es decir, se utilizará la implementación específica de cada objeto.

El polimorfismo en JavaScript nos permite escribir código más flexible y extensible, ya que podemos trabajar con diferentes objetos de clases derivadas utilizando una interfaz común proporcionada por la clase base. Esto facilita la reutilización de código y nos permite diseñar estructuras más escalables y modulares.

Abstracción

La abstracción consiste en definir clases abstractas o interfaces para establecer comportamientos comunes entre varias clases. En JavaScript, no hay soporte nativo para clases abstractas o interfaces, pero podemos simularlos utilizando convenciones de nomenclatura y documentación. Por ejemplo:

class Vehiculo {
  // Método abstracto simulado
  conducir() {
    throw new Error("Método conducir() debe ser implementado.")
  }
}

class Automovil extends Vehiculo {
  conducir() {
    console.log("Conduciendo el automóvil.")
  }
}

class Motocicleta extends Vehiculo {
  conducir() {
    console.log("Conduciendo la motocicleta.")
  }
}

let elVehiculo = new Vehiculo()
let elAutomovil = new Automovil()
let laMotocicleta = new Motocicleta()

elAutomovil.conducir() // Conduciendo el automóvil.
laMotocicleta.conducir() // Conduciendo la motocicleta.
elVehiculo.conducir() // Error: Método conducir() debe ser implementado.

La clase Vehiculo se define como una clase abstracta mediante la definición de un método conducir() sin una implementación concreta. Al marcar este método con la palabra clave throw new Error, indicamos que cualquier intento de llamar a este método directamente en la clase abstracta o en una instancia de la clase abstracta resultará en un error. Esto sirve como una señal para las clases derivadas de que deben implementar este método de forma obligatoria.

En JavaScript no se producirá un error al intentar crear una instancia de una clase abstracta, ya que no hay soporte nativo para clases abstractas. La instancia se creará sin problemas, pero es importante tener en cuenta que la intención detrás de marcar una clase como abstracta es indicar que no se debe crear una instancia directamente de ella.

Esta simulación de clases abstractas en JavaScript nos permite establecer un contrato entre la clase abstracta y las clases derivadas, asegurando que las clases derivadas implementen los comportamientos requeridos. Esto nos brinda un nivel de abstracción y flexibilidad en nuestro código, al definir comportamientos comunes en una clase abstracta y permitir que las clases derivadas agreguen funcionalidades adicionales según sea necesario.

En conclusión

La Programación Orientada a Objetos en JavaScript te proporciona una forma estructurada y modular de escribir código. A través de la creación de clases, herencia, encapsulamiento, polimorfismo y abstracción, puedes desarrollar aplicaciones más flexibles, mantenibles y escalables.

¡Explora estos conceptos y comienza a aprovechar el poder de la POO en tus proyectos JavaScript!

Imagen del Post Introducción a JavaScript: Fundamentos y conceptos básicos

Introducción a JavaScript: Fundamentos y conceptos básicos

JavaScript

Por Editorial | 1771 vistas | Lectura de 17 minutos

Imagen del Post Creando aplicaciones nativas con JavaScript: Titanium

Creando aplicaciones nativas con JavaScript: Titanium

Titanium

Por Rene Pot | 437 vistas | Lectura de 3 minutos

Imagen del Post Cómo hacer peticiones efectivas a ChatGPT sobre programación

Cómo hacer peticiones efectivas a ChatGPT sobre programación

Programación ChatGPT

Por Editorial | 2926 vistas | Lectura de 9 minutos

Contáctanos por WhatsApp

Copyright © 2024 Código Móvil. Todos los Derechos Reservados.