PROGRAMACIÓN ORIENTADA A OBJETOS EN JAVASCRIPT
La Programación Orientada a Objetos (POO) es un paradigma de programación que organiza el código en torno a objetos, que son instancias de clases que encapsulan datos (propiedades) y comportamientos (métodos). JavaScript, aunque originalmente no estaba diseñado específicamente para POO, soporta este paradigma de forma robusta gracias a sus características modernas como clases (introducidas en ES6) y prototipos. En este post, se exploran los conceptos fundamentales de la programación orientada a objetos en Javascript y con un un ejemplo sencillo.- Para declarar métodos privados hay que poner "#" . Ejemplo:
- Para declarar atributos privados hay que poner "#" . Ejemplo:
- En JavaScript, los métodos estáticos en Programación Orientada a Objetos (POO) se declaran utilizando la palabra clave static dentro de una clase. Estos métodos pertenecen a la clase en sí, no a las instancias de la clase, lo que significa que no necesitas crear un objeto de la clase para llamarlos. A continuación, te explico cómo declararlos y usarlos:
class Calculadora { // Método estático static sumar(a, b) { return a + b; } // Otro método estático static multiplicar(a, b) { return a * b; } } // Llamada a métodos estáticos sin instanciar la clase console.log(Calculadora.sumar(5, 3)); // Output: 8 console.log(Calculadora.multiplicar(4, 2)); // Output: 8
class MiClase {
// Método público
metodoPublico() {
console.log("Este es un método público");
this.#metodoPrivado(); // Llamada al método privado
}
// Método privado
#metodoPrivado() {
console.log("Este es un método privado");
}
}
class MiClase {
#atributoPrivado; // Declaración de atributo privado
atributoPublico; // Declaración de atributo púbico
constructor(valor) {
this.#atributoPrivado = valor; // Inicialización
}
// Método para acceder al atributo privado
getAtributoPrivado() {
return this.#atributoPrivado;
}
// Método para modificar el atributo privado
setAtributoPrivado(nuevoValor) {
this.#atributoPrivado = nuevoValor;
}
}
Conceptos Clave de la Programación Orientada a Objetos en JavaScript
- Clases y Objetos: Una clase es una plantilla que define la estructura y comportamiento de los objetos. Un objeto es una instancia de una clase.
- Encapsulamiento: Permite ocultar los detalles internos de un objeto y exponer solo lo necesario mediante métodos públicos. En JavaScript, se logra con variables privadas y métodos.
- Herencia: Permite que una clase derive de otra, heredando sus propiedades y métodos. En JavaScript, se usa extends para implementar herencia.
- Polimorfismo: Permite que diferentes clases implementen métodos con el mismo nombre pero con comportamientos distintos.
- Abstracción: Simplifica sistemas complejos al modelar solo los aspectos relevantes de un objeto.
JavaScript implementa la POO principalmente a través de prototipos y, desde ES6, con una sintaxis de clases más clara y similar a otros lenguajes orientados a objetos.
Ejemplo:
// Clase base: Vehiculo
class Vehiculo {
#velocidad; // Propiedad privada
constructor(marca, modelo) {
this.marca = marca;
this.modelo = modelo;
this.#velocidad = 0; // Inicializamos la velocidad en 0
}
// Método para acelerar
acelerar(incremento) {
this.#velocidad += incremento;
return `${this.marca} ${this.modelo} acelera a ${this.#velocidad} km/h`;
}
// Método para frenar
frenar() {
this.#velocidad = 0;
return `${this.marca} ${this.modelo} se ha detenido`;
}
// Getter para obtener la velocidad
getVelocidad() {
return this.#velocidad;
}
// Método que será sobrescrito (polimorfismo)
describir() {
return `Vehículo: ${this.marca} ${this.modelo}`;
}
}
// Clase derivada: Coche
class Coche extends Vehiculo {
constructor(marca, modelo, numPuertas) {
super(marca, modelo); // Llama al constructor de la clase base
this.numPuertas = numPuertas;
}
// Sobrescribimos el método describir (polimorfismo)
describir() {
return `Coche: ${this.marca} ${this.modelo} con ${this.numPuertas} puertas`;
}
// Método específico de Coche
activarModoSport() {
return `${this.marca} ${this.modelo} ha activado el modo sport`;
}
}
// Uso del sistema
const miCoche = new Coche("Toyota", "Corolla", 4);
console.log(miCoche.describir()); // Coche: Toyota Corolla con 4 puertas
console.log(miCoche.acelerar(50)); // Toyota Corolla acelera a 50 km/h
console.log(miCoche.getVelocidad()); // 50
console.log(miCoche.activarModoSport()); // Toyota Corolla ha activado el modo sport
console.log(miCoche.frenar()); // Toyota Corolla se ha detenido
const miVehiculo = new Vehiculo("Honda", "Civic");
console.log(miVehiculo.describir()); // Vehículo: Honda Civic
console.log(miVehiculo.acelerar(30)); // Honda Civic acelera a 30 km/h
Hasta ahora no me había atrevido con la Programación orientada a objetos en Javascript porque pensaba que era más complicado.
// Clase base: Vehiculo
class Vehiculo {
#velocidad; // Propiedad privada
constructor(marca, modelo) {
this.marca = marca;
this.modelo = modelo;
this.#velocidad = 0; // Inicializamos la velocidad en 0
}
// Método para acelerar
acelerar(incremento) {
this.#velocidad += incremento;
return `${this.marca} ${this.modelo} acelera a ${this.#velocidad} km/h`;
}
// Método para frenar
frenar() {
this.#velocidad = 0;
return `${this.marca} ${this.modelo} se ha detenido`;
}
// Getter para obtener la velocidad
getVelocidad() {
return this.#velocidad;
}
// Método que será sobrescrito (polimorfismo)
describir() {
return `Vehículo: ${this.marca} ${this.modelo}`;
}
}
// Clase derivada: Coche
class Coche extends Vehiculo {
constructor(marca, modelo, numPuertas) {
super(marca, modelo); // Llama al constructor de la clase base
this.numPuertas = numPuertas;
}
// Sobrescribimos el método describir (polimorfismo)
describir() {
return `Coche: ${this.marca} ${this.modelo} con ${this.numPuertas} puertas`;
}
// Método específico de Coche
activarModoSport() {
return `${this.marca} ${this.modelo} ha activado el modo sport`;
}
}
// Uso del sistema
const miCoche = new Coche("Toyota", "Corolla", 4);
console.log(miCoche.describir()); // Coche: Toyota Corolla con 4 puertas
console.log(miCoche.acelerar(50)); // Toyota Corolla acelera a 50 km/h
console.log(miCoche.getVelocidad()); // 50
console.log(miCoche.activarModoSport()); // Toyota Corolla ha activado el modo sport
console.log(miCoche.frenar()); // Toyota Corolla se ha detenido
const miVehiculo = new Vehiculo("Honda", "Civic");
console.log(miVehiculo.describir()); // Vehículo: Honda Civic
console.log(miVehiculo.acelerar(30)); // Honda Civic acelera a 30 km/h