Clases y POO
Clases y POO Fundamental
Section titled “Clases y POO ”Definición de clases Básico
Section titled “Definición de clases ”Sintaxis básica
Section titled “Sintaxis básica”class Usuario { constructor(nombre, email) { this.nombre = nombre; this.email = email; }
saludar() { return `Hola, soy ${this.nombre}`; }}
const usuario = new Usuario('Ana', 'ana@email.com');console.log(usuario.saludar()); // "Hola, soy Ana"Propiedades privadas
Section titled “Propiedades privadas”class CuentaBancaria { #saldo = 0; // Propiedad privada
constructor(titular) { this.titular = titular; }
depositar(cantidad) { if (cantidad > 0) { this.#saldo += cantidad; return true; } return false; }
obtenerSaldo() { return this.#saldo; }}
const cuenta = new CuentaBancaria('Juan');cuenta.depositar(100);console.log(cuenta.obtenerSaldo()); // 100// console.log(cuenta.#saldo); // Error: propiedad privadaHerencia Avanzado
Section titled “Herencia ”Extendiendo clases
Section titled “Extendiendo clases”class Animal { constructor(nombre) { this.nombre = nombre; }
hablar() { return 'El animal hace un sonido'; }}
class Perro extends Animal { constructor(nombre, raza) { super(nombre); this.raza = raza; }
hablar() { return 'Guau guau!'; }}
const perro = new Perro('Max', 'Labrador');console.log(perro.hablar()); // "Guau guau!"Getters y Setters Intermedio
Section titled “Getters y Setters ”class Producto { #precio = 0;
constructor(nombre, precio) { this.nombre = nombre; this.precio = precio; // Usa el setter }
get precio() { return `$${this.#precio}`; }
set precio(valor) { if (valor < 0) throw new Error('El precio no puede ser negativo'); this.#precio = valor; }}
const producto = new Producto('Laptop', 999);console.log(producto.precio); // "$999"// producto.precio = -100; // ErrorMétodos estáticos Avanzado
Section titled “Métodos estáticos ”class Calculadora { static sumar(a, b) { return a + b; }
static multiplicar(a, b) { return a * b; }}
console.log(Calculadora.sumar(5, 3)); // 8console.log(Calculadora.multiplicar(4, 2)); // 8Patrones de diseño Avanzado
Section titled “Patrones de diseño ”Singleton
Section titled “Singleton”class Configuracion { static #instancia; #config = {};
constructor() { if (Configuracion.#instancia) { return Configuracion.#instancia; } Configuracion.#instancia = this; }
set(clave, valor) { this.#config[clave] = valor; }
get(clave) { return this.#config[clave]; }}
const config1 = new Configuracion();const config2 = new Configuracion();console.log(config1 === config2); // trueFactory
Section titled “Factory”class ProductoFactory { static crearProducto(tipo, nombre, precio) { switch (tipo) { case 'libro': return new Libro(nombre, precio); case 'electronico': return new Electronico(nombre, precio); default: throw new Error('Tipo de producto no válido'); } }}
class Libro { constructor(nombre, precio) { this.nombre = nombre; this.precio = precio; this.tipo = 'libro'; }}
class Electronico { constructor(nombre, precio) { this.nombre = nombre; this.precio = precio; this.tipo = 'electronico'; }}
const libro = ProductoFactory.crearProducto('libro', 'JavaScript Avanzado', 29.99);console.log(libro.tipo); // "libro"Mejores prácticas Recomendado
Section titled “Mejores prácticas ”Encapsulación
Section titled “Encapsulación”// ✅ Buenoclass Usuario { #password;
constructor(username, password) { this.username = username; this.#password = this.#hashPassword(password); }
#hashPassword(password) { // Método privado para hash return password.split('').reverse().join(''); }
verificarPassword(password) { return this.#password === this.#hashPassword(password); }}Composición sobre herencia
Section titled “Composición sobre herencia”// ❌ Malo: Herencia profundaclass Animal extends SerVivo extends Organismo { }
// ✅ Bueno: Composiciónclass Animal { constructor() { this.serVivo = new SerVivo(); this.organismo = new Organismo(); }}Principio de responsabilidad única
Section titled “Principio de responsabilidad única”// ❌ Maloclass Usuario { guardarEnDB() { } enviarEmail() { } generarReporte() { }}
// ✅ Buenoclass Usuario { obtenerDatos() { }}
class UsuarioRepositorio { guardar(usuario) { }}
class EmailService { enviar(usuario, mensaje) { }}
class ReporteService { generar(usuario) { }}
🐝