Clases
## Objetivos de Aprendizaje
- Crear clases con constructores
- Definir métodos y propiedades
- Entender herencia de clases
- Usar getters y setters
## Introducción a las Clases
### Declaración de Clase
```javascript
class Persona {
constructor(nombre, edad) {
this.nombre = nombre;
this.edad = edad;
}
saludar() {
return `¡Hola! Soy ${this.nombre}`;
}
}
const ana = new Persona("Ana", 28);
console.log(ana.saludar()); // "¡Hola! Soy Ana"
console.log(ana.edad); // 28
```
### Expresión de Clase
```javascript
const Persona = class {
constructor(nombre) {
this.nombre = nombre;
}
};
```
## Constructor
### Constructor Básico
```javascript
class Coche {
constructor(marca, modelo, año) {
this.marca = marca;
this.modelo = modelo;
this.año = año;
}
}
const miCoche = new Coche("Toyota", "Corolla", 2023);
console.log(miCoche.marca); // "Toyota"
```
### Constructor con Valores Predeterminados
```javascript
class Persona {
constructor(nombre = "Anónimo", edad = 0) {
this.nombre = nombre;
this.edad = edad;
}
}
const persona = new Persona();
console.log(persona.nombre); // "Anónimo"
```
## Métodos
### Métodos de Instancia
```javascript
class Calculadora {
constructor() {
this.resultado = 0;
}
sumar(n) {
this.resultado += n;
}
restar(n) {
this.resultado -= n;
}
obtenerResultado() {
return this.resultado;
}
}
const calc = new Calculadora();
calc.sumar(10);
calc.restar(3);
console.log(calc.obtenerResultado()); // 7
```
### Métodos Estáticos
```javascript
class Matematicas {
static sumar(a, b) {
return a + b;
}
static PI = 3.14159;
}
console.log(Matematicas.sumar(5, 3)); // 8
console.log(Matematicas.PI); // 3.14159
```
## Getters y Setters
### Definición
```javascript
class Persona {
constructor(nombre) {
this._nombre = nombre;
}
get nombre() {
return this._nombre.toUpperCase();
}
set nombre(valor) {
this._nombre = valor.trim();
}
}
const persona = new Persona(" Juan ");
console.log(persona.nombre); // "JUAN"
persona.nombre = " Ana ";
console.log(persona.nombre); // "ANA"
```
### Validación con Setter
```javascript
class Temperatura {
constructor(celsius) {
this.celsius = celsius;
}
get fahrenheit() {
return (this.celsius * 9/5) + 32;
}
set fahrenheit(valor) {
this.celsius = (valor - 32) * 5/9;
}
}
const temp = new Temperatura(25);
console.log(temp.fahrenheit); // 77
temp.fahrenheit = 86;
console.log(temp.celsius); // 30
```
## Campos Privados
### Con # (Hash)
```javascript
class Contador {
#conteo = 0;
incrementar() {
this.#conteo++;
}
obtenerConteo() {
return this.#conteo;
}
}
const contador = new Contador();
contador.incrementar();
contador.incrementar();
console.log(contador.obtenerConteo()); // 2
// console.log(contador.#conteo); // Error: privado
```
## Herencia
### Extends
```javascript
class Animal {
constructor(nombre) {
this.nombre = nombre;
}
hablar() {
return "Sonido";
}
}
class Perro extends Animal {
hablar() {
return "¡Guau!";
}
}
class Gato extends Animal {
hablar() {
return "¡Miau!";
}
}
const perro = new Perro("Buddy");
console.log(perro.nombre); // "Buddy"
console.log(perro.hablar()); // "¡Guau!"
```
### super
```javascript
class Persona {
constructor(nombre, edad) {
this.nombre = nombre;
this.edad = edad;
}
}
class Empleado extends Persona {
constructor(nombre, edad, salario) {
super(nombre, edad); // Llamar al constructor padre
this.salario = salario;
}
}
const emp = new Empleado("Juan", 30, 50000);
console.log(emp.nombre); // "Juan"
console.log(emp.salario); // 50000
```
## Métodos Privados
```javascript
class Calculadora {
_resultado = 0;
_validarNumero(n) {
if (typeof n !== "number" || isNaN(n)) {
throw new Error("Número inválido");
}
}
sumar(n) {
this._validarNumero(n);
this._resultado += n;
}
obtenerResultado() {
return this._resultado;
}
}
```
## toString
```javascript
class Persona {
constructor(nombre, edad) {
this.nombre = nombre;
this.edad = edad;
}
toString() {
return `Persona(${this.nombre}, ${this.edad})`;
}
}
const persona = new Persona("Ana", 28);
console.log(persona.toString()); // "Persona(Ana, 28)"
console.log(String(persona)); // "Persona(Ana, 28)"
```
## Resumen
- Clases: `class Nombre { constructor() {...} }`
- `constructor` inicializa la instancia
- Métodos: funciones dentro de clases
- `static` para métodos de clase (no de instancia)
- Getters/setters: `get prop() {} set prop(v) {}`
- Campos privados: `#campo` (solo accesible dentro de la clase)
- Herencia: `class Hija extends Madre`
- `super()` llama al constructor padre
- `toString()` define representación string del objeto
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →