Uno de los principales problemas que resuelve el paradigma de programación orientada a objetos es el orden. También nos ayuda a reutilizar código.

Las clases son los moldes de donde luego salen los objetos. Podemos tener múltiples objetos de una misma clase. Es decir, los objetos son instancias de una clase.

Gracias a la herencia podemos crear nuevas clases a partir de otras

Los objetos nos permiten definir atributos, para guardar valores; y además métodos (funciones dentro del objeto).


POO en Javascript

Abstracción

Encapsulamiento

Herencia

Polimorfismo

Para crear nuevos elementos y poder utilizarlos en nustro programa, Javascript nos da la posibilidad de crear objetos, los cuales se crean con prototipos.

<aside> ⚠️ Los objetos literales no pertenecen a POO en Javascript.

// Objeto literal
const obj = {
	name: 'Juan',
	age: 32,
	method_1: function () {
		// bloque de código
	},
	method_2() {
		// bloque de código
	},
};

Los objetos literales en JavaScript son una instancia del prototipo Object que es creado de forma “nativa” por JS.

</aside>

Prototipos en JS

Los objetos son creados a traves de prototipos, el prototipo base es Object. Por esto, todos los objetos tienen la propiedad ‘proto’, donde se encuentran todos los métodos y atributos de object. No es necesario acceder primero a la propiedad proto para utilizar un método (obj.proto.method()) → obj.method()

function Student(name, age, cursosAprobados) {
	this.name = name;
	this.age = age;
	this.cursosAprobados = cursosAprobados;
	
	this.aprobarCurso = function(curso) {
		this.cursosAprobados.push(curso);
	}
}
Student.prototype.cumplirAnios = function () {
	this.age += 1;
}

const juan = new Student('Juan', 32, []);
juan.aprobarCurso('Curso básico de Programación');
juan.cumplirAnios();

Clases

La sintaxis de clases es más “amigable”, pero por dentro son prototipos. Los objetos en JS están basados en prototipos.

class Student {
	constructor(name, age, cursosAprobados) {
		this.name = name;
		this.age = age;
		this.cursosAprobados = cursosAprobados;
	}

	aprobarCurso(curso) {
		this.cursosAprobados.push(curso);
	}
}

const juan = new Student('Juan', 32, []);
juan.aprobarCurso('Curso definitivo de HTML y CSS');

// clases con valores por defecto en el constructor
class Student2 {
	constructor({
			name,
			age,
			cursosAprobados = [],
			email = "",
		}) {
		
	}
}

const juana = new Student2({
	name: 'Juana',
	age: 33,
});