La programación orientada a objetos (POO) es un paradigma de programación que se enfoca en el uso de objetos y sus interacciones para modelar y resolver problemas de la vida real.
En JavaScript, cada objeto tiene un prototipo, que es otro objeto del que hereda propiedades y métodos. Esto permite a los objetos compartir comportamiento entre sí de manera eficiente, en lugar de tener que definir todas sus propiedades y métodos individualmente.
Por ejemplo, podemos crear un objeto person que tenga un prototipo personProto:
const personProto = {
greet() {
console.log('Hello!');
},
};
const person = Object.create(personProto);
En este caso, el objeto person hereda el método greet() del objeto personProto. Luego, podemos llamar al método greet() en el objeto person:
person.greet(); // Hello!
La POO se basa en cuatro principios fundamentales: abstracción, encapsulamiento, herencia y polimorfismo.
classAnimal{
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} hace un sonido.`);
}
}
En el ejemplo (muy muy simple) se puede ver que lo más básico que necesitaría es un nombre para un animal y un método “speak” para luego a partir de estos crear otros animales en otras clases. Lo verán más adelante en la herencia.
Encapsulamiento
Es un principio de programación que consiste en ocultar los detalles de implementación de una clase o objeto, y exponer solo la interfaz necesaria para que otros componentes puedan interactuar con él. De esta manera, se garantiza que los componentes dependan solo de la interfaz de la clase o objeto, y no de su implementación concreta.
Para acceder a estas propiedades y métodos "ocultos" se pueden usar getters y setters
**Los getters** son funciones que se utilizan para obtener el valor de una propiedad de un objeto
**Los setters** son funciones que se utilizan para establecer un nuevo valor para una propiedad de un objeto.**
Herencia
Es un concepto de programación orientada a objetos que permite que una clase adquiera las propiedades y comportamientos de otra clase. En JavaScript, la herencia se logra mediante el uso de la palabra clave ** extends** y permite que una clase hija herede las propiedades y métodos de una clase padre.
classAnimal{
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} hace un sonido.`);
}
}
classDogextendsAnimal{
constructor(name, type) {
super(name);
this.type = type;
}
}
En el ejemplo la clase Dog toma el método “speak” y la propiedad “name” de la clase Animal y adicionalmente añade otra propiedad “type”
Ejemplo de sobrecarga:
Tenemos una clase Calculator que tiene un método add() que recibe dos números y devuelve su suma:
classCalculator{
add(a, b) {
return a + b;
}
}
Luego, podemos agregar otra implementación de add() que recibe un solo número y devuelve ese número incrementado en uno:
class Calculator {
add(a, b) {
return a + b;
}
add(a) {
return a + 1;
}
}
En este caso la clase puede ejecutar el método “add” de dos formas para así obtener distintos resultados.
Ejemplo de Polimorfismo de reemplazo:
Mantenemos la clase Animal con su método “speak”
classAnimal{
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
Luego al crear la clase Dog podemos modificar el comportamiento del método “speak” para obtener otro resultado
classDogextendsAnimal{
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
Si quieren aprender más sobre este tema, les recomiendo las Clases de Javascript que hay en la nueva escuela de Javasript 👀
Debemos tener en cuenta que en Javascript los métodos no se pueden sobrecargar como en otros lenguajes, por lo tanto el siguiente código siempre va a llamar al método add de abajo:
class Calculator { add(a, b) { return a + b; } add(a) { return a + 1; } }