La programación orientada a objetos es un paradigma de programación enfocado en organizar el desarrollo en objetos (clases) que sean flexibles y reutilizables a lo largo del software mediante datos y objetos que tienen sus atributos y comportamientos únicos.
Desde sus inicios, JavaScript era compatible con la programación orientada a objetos mediante prototipos, lo que lo hacía un poco problemático. Con la versión ES6 se incorporó una sintaxis más conocida (clases), brindando así una mejor experiencia al desarrollar con este paradigma. Por su parte, TypeScript, el superset de JavaScript, permite trabajar con esta sintaxis junto con otro tipo de reglas, lo que hace más atractivo y eficiente el desarrollo de aplicaciones con esta herramienta.
A continuación, las características más importantes de la programación orientada a objetos con su sintaxis y formas de trabajar:
Herencia:
Una clase hija puede heredar atributos o métodos de una clase padre mediante la palabra clave extends.
class Animal {
nombre: string;
raza: string;
edad: number;
constructor(nombre: string, raza: string, edad: number) {
this.nombre = nombre;
this.raza = raza;
this.edad = edad;
}
}
class Perro extends Animal {
constructor(nombre: string, raza: string, edad: number, public vuela: boolean, public muerde: boolean) {
super(nombre, raza, edad);
}
}
Aquí podemos ver un ejemplo claro de herencia donde la clase Perro extiende de la clase Animal mediante extends, creando una instancia de la clase. La función del constructor se ejecuta cada vez que se instancia la clase, y super recibe las propiedades que se quieren heredar de la clase padre.
Encapsulamiento:
Define el acceso que se puede tener a una clase desde el exterior y en la instanciación de la misma. Estos permisos de acceso se definen por medio de niveles que definiremos a continuación:
Public: Es el nivel más bajo de protección y permite que toda clase que se extienda o desde el exterior pueda acceder a sus datos.
Private: Las propiedades o métodos definidos con este nivel solo pueden ser vistos dentro de la misma clase que los define; desde ningún otro lugar fuera de la misma se puede acceder.
Protected: No se puede acceder desde cualquier lugar, solamente permite el acceso a los métodos o propiedades desde la clase que se crea o en las clases que la heredan.
Polimorfismo:
Uno de los conceptos más importantes en la programación orientada a objetos se refiere a la capacidad de métodos o atributos con un mismo nombre y diferente firma, siendo llamados en otros objetos o clases instanciadas con un resultado distinto, adaptándose a la necesidad de la misma.
class Animal {
hacerSonido(): void {
console.log('Sonido del animal');
}
}
class Gato extends Animal {
hacerSonido(): void {
console.log('Maúlla');
}
}
Interfaces:
Las interfaces son como contratos que definen el tipo de datos que se puede aplicar a una clase o método mediante la palabra clave implements. Esta debe seguir la norma de que los atributos que contenga deben ser específicamente del tipo de dato definido en la interfaz. Esto ayuda a tener un mayor control del tipo de dato de cada atributo o método que se crea en la clase. Importante saber que las interfaces no crean instancias a comparación de las clases.
interface Automovil {
marca: string;
modelo: number;
kilometraje: number;
}
class Mazda implements Automovil {
private velocidad: string;
private asientos: number;
constructor(marca: string, modelo: number, kilometraje: number) {
this.marca = marca;
this.modelo = modelo;
this.kilometraje = kilometraje;
}
}
Clases Abstractas:
Las clases abstractas sirven como plantilla para que otras clases hereden los atributos y métodos de ella. Es importante saber que no pueden instanciarse; se pueden crear nuevas clases y extenderse de esta misma. Estas clases se definen con la palabra clave abstract.
abstract class Instrumento {
abstract tipo: string;
abstract tocar(): void;
}
class Guitarra extends Instrumento {
tipo: string;
tocar(): void {
console.log('Tocando la guitarra');
}
}
Constructores:
Este importante método de la programación orientada a objetos se dispara o se llama automáticamente cada vez que se crea una instancia de la clase. Como hemos podido observar en los ejemplos anteriores, el constructor es vital en la inicialización de las diferentes clases y su instanciación.
class Usuario {
private nombre: string;
private edad: number;
constructor(nombre: string, edad: number) {
this.nombre = nombre;
this.edad = edad;
}
}
Top comments (0)