Classes are only syntactical sugar for constructor functions. Everything still works the same way!
JavaScript Orientado a Objetos
JavaScript: orientado a objetos, basado en prototipos
Qué es programación orientada a objetos
Bonus: fútbol y programación orientada a objetos
Objetos, clases y prototipos
Qué es un objeto en JavaScript
Objetos literales y prototipos en JavaScript
Clases en JavaScript
Ventajas de la programación orientada a objetos
Playgrounds: Manejo de clases
Pilares de la POO: abstracción y encapsulamiento
Qué es abstracción
Abstracción en JavaScript
Qué es encapsulamiento
Getters y setters en JavaScript
Módulos de ECMAScript 6
Playgrounds: Controlar accesos con get y set
Pilares de la POO: herencia y polimorfismo
Qué es herencia
Herencia en JavaScript
Qué es polimorfismo
Polimorfismo en JavaScript
Playgrounds: Sobrescribir métodos heredados
Próximos pasos
Toma el Curso Intermedio de Programación Orientada a Objetos en JavaScript
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Juan David Castro Gallego
Aportes 58
Preguntas 13
Classes are only syntactical sugar for constructor functions. Everything still works the same way!
PATRÓN “RORO”
El patrón que menciona JuanDC se llama “RORO” del Inglés “Receive an object, return an object” (Recibe un objeto, devuelve un objeto).
Nos ayuda cuando tenemos muchos parámetros en nuestro constructor, ya que al instanciar la clase debemos acordarnos del orden de los parámetros y, además, no podemos tener parámetros por defecto.
No obstante, si recibimos un objeto, sí podemos poner parámetros por defecto y no recibir un parámetros si fuere el caso, sin que pase nada.
A la hora de enviar los argumentos al instanciar la clase, también debe enviarse un objeto, y otra ventaja es que esos argumentos no hace falta que estén en el mismo orden que están los parámetros del constructor. ¡Prácticamente son todo ventajas! 😃
Me ha encantado aprender este patrón ¡Gracias, profe!
Os dejo un link con documentación sobre le patrón RORO (está en Inglés) -> https://www.freecodecamp.org/news/elegant-patterns-in-modern-javascript-roro-be01e7669cbd/
¡Ánimo y a seguir aprendiendo JavaScript! 😄
Quede asombradísimo en como escribía en 2 partes a la vez y como movía líneas, lo busque y encontré que era así
Escribir en varios lados a la vez
alt + click
Mover una línea hacia arriba y abajo
alt + flecha hacia arriba (o flecha hacia abajo)
Copiar una línea hacia arriba o abajo
alt + shift + flecha hacia arriba (o flecha hacia abajo)
Borrar una línea completa a la vez
shift + supr
Habia escuchado la explicacion de que en javascript no hay clases sino prototipos mil veces y nunca lo entendi, hasta ahora.
Nadie: …🦗
Javascript: Bueno los objetos, prototipos y clases son muy diferentes, acá tienen una foto donde lo pueden ver
Clases
En ES2016, ahora podemos usar la palabra clave Class , así como los métodos mencionados anteriormente para manipular el prototype. Las clases de JavaScript son atractivas para los desarrolladores con experiencia en programación orientada a objetos, pero esencialmente hace lo mismo que el anterior.
class Rectangle {
constructor(height, width) {
this.height = height
this.width = width
}
get area() {
return this.calcArea()
}
calcArea() {
return this.height * this.width
}
}
const square = new Rectangle(10, 10)
console.log(square.area) // 100
Esto es básicamente lo mismo que:
function Rectangle(height, width) {
this.height = height
this.width = width
}
Rectangle.prototype.calcArea = function calcArea() {
return this.height * this.width
}
Los métodos getter y setter en las clases vinculan una propiedad Object a una función que será llamada cuando se busque esa propiedad. Esto es solo azúcar sintáctico para ayudar a que sea más fácil buscar o establecer propiedades.
Pense en saltarme este curso porque segun yo ya dominaba el tema…NOT.
Gracias JDC, muy buena explicacion!
Entonces eso de usar clases es simplemente sintaxis diferente, interesante 😮
//* Prototipos con sintaxis de clases
class Alumno {
constructor({
name,
age,
cursosAprobados = [], //* Por defecto el parámetro tiene un valor vacío
email,
}) {
this.name = name
this.age = age
this.cursosAprobados = cursosAprobados
this.email = email
}
aprobarCurso(nuevoCursito) {
this.cursosAprobados.push(nuevoCursito)
}
};
const patricia = new Alumno({
name: 'Patricia',
age: 21,
cursosAprobados: ['Cocina'],
email: '[email protected]'
});
Las Clases son una forma mas bonita de crear prototipos. 😄
constructor
class Student2 {
constructor(name, age, cursosAprobados) {
this.name = name;
this.age = age;
this.cursosAprobados = cursosAprobados;
}
}
class Student2 {
constructor(name, age, cursosAprobados) {
this.name = name;
this.age = age;
this.cursosAprobados = cursosAprobados;
}
aprobarCurso(nuevoCursito) {
this.cursosAprobados.push(nuevoCursito);
}
}
const obj = new Clase();
📌 **RESUMEN:** Una clase en JavaScript no es más que una sintaxis en algunos casos más cómoda para crear prototipos. Está basada en otros lenguajes los cuales tienen programación orientada a objetos mediante clases.
Wow de verdad antes no entendia esto de que las clases no existen en JS hasta ahora 😃
Patron RORO:
GRACIAS JUAN!! Tus clases son las mejores ❤️
Hay un patrón interesante en todo esto respecto a RORO. Si bien es bastante útil directamente recibir un objeto, el problema termina siendo el mismo a la larga porque imaginate que por cada nueva llave que introduzcas en el objeto tengas que además modificar tu constructor y sus propiedades. La verdad es que es mucho mas interesante si creas un atributo params
que sea un Object Literal y lo iteras para hacer una asignación:
class Student2 {
constructor({ name, age, approved = [] }, params) {
this.name = name;
this.age = age;
this.approvedCourses = approved;
if (params && Object.keys(params).length) {
for (const param in params) {
if (Object.hasOwnProperty.call(params, param)) {
const item = params[param];
this[param] = item;
}
}
}
}
approveCourse(course) {
this.approvedCourses.push(course);
}
}
const natalia = new Student2({
name: 'Natalia',
age: 20
}, {
sexo: 'F',
twitter: 'twitter.com/natalia',
foo: 'bar'
});
Y listo, ahora tenemos una serie de parámetros básicos que podemos definir con algún default, y luego una serie de parámetros opcionales que podemos definir libremente dentro de un objeto que serán asignados a nuestra instancia.
La clase recibe un solo parámetro, un objeto. En nuestro objeto declaramos un array vacío por defecto para la lista de cursos aprobados.
class Student {
constructor({name, age, email, approved = []}){
this.name = name;
this.age = age;
this.email = email;
this.approved = approved;
}
addApproved(curso){
this.approved.push(curso);
}
}
const alexander = new Student({
name: "Alexander",
age: 21,
email: "[email protected]",
});
Con ES6 + en vez de escribir
this.name = name;
se puede utilizar solo
name
Personalmente me agrada mucho la sintaxis con clases, ya que se parece mucho a la de otros lenguajes como Java o Python. A pesar de que son solo sugar syntax de los prototipos.
The feynman technique: Explicale a un nene de 5 años y crea metaforas para guardar la inforamcion a largo plazo.
Supongamos que queremos hacer 🍪, El molde es Circular pero sin la base.
constructor({})
El constructor es el molde circular sin la base nos permite ingresar las propiedades para hacer las galletitas(como la pasta)this.name = name;
Esta seccion es aun mas importante, esta es la base es decir, nos dimos cuenta que no podemos hacer las galletitas sin la base porque se nos cae la pasta****.**** Entonces la base = almacenamiento. Esto es el almacenamiento de las propiedades(pasta) de la instancia(galletitas).Hay una diferencia entre prototipos normales y clases. Si tu tratas de instanciar un objeto Student con una clase antes que es esta clase sea declarada, te saldrá el siguiente error:
ReferenceError: Cannot access 'Student' before initialization
Eso no pasa con prototipos. El hoisting se aplica diferente
JavaScrip es tan potente que puede trabajar tanto con prototipos como clase
JavaScript por naturaleza trabaja con prototipos
Las clases en Java (Java Class) son plantillas para la creación de objetos. Como tal, la clase forma la base para la programación orientada a objetos en Java, la cual es una de los principales paradigmas de desarrollo de software en la actualidad.
que bonito conocer como funciona este lenguaje a fondo.
Buenas a todos, Esto es para aquellos que se quedaron con la duda de como aplicar el RORO:
Pasos a seguir dentro de los parentesis del constructor de la clase:
1.Poner las llaves que representan a un objeto dentro de los parentesis del constructor.
2.Dentro de las llaves del objeto que estan adentro del constructor pondremos los parametros.
ejemplo:
class Student{ constructor({ name, age, etc.. }) }
Razon de porque estamos haciendo esto:
Se hace de esta manera ya que asi tendriamos un solo parametro dentro del constructor y lo que antes eran los parametros se convertiran en propiedades del objeto.
Pasos a seguir en la nueva intancia:
1.Pondremos las llaves que representan a un objeto en los parentesis de la nueva instancia
2.Escribiremos los argumentos dentro de las llaves del objeto, se deben de escribir como propiedades del objeto.
ejemplo:
```
const miguelito = new Student({
name: 'Miguel',
age: 20,
etc..
})
```
Beneficios de esta tecnica:
No importara el orden en que pongamos los valores de la nueva instancia. De esta manera evitaremos muchos errores posibles.
Diferencia entre Argumento y parametros:
Los parametros son el valor general de lo que podrias mandar mientras que el argumento seria el valor mandado .
ejemplos:
parametro(nombre) = argumento(Miguel)
parametro(metas) = argumento(Alcanzar la cima del exito, por multiples razones)
parametro(edad) = argumento(20)
parametro(cantidad de tiempo que estudia en platzi) = argumento(8 hrs, los 7 dias)
parametro(estudia) = argumento(ingenieria en software)
Ojala que a alguien le sea util y recuerden ustedes pueden, solo es que necesitamos disciplina y no desesperarnos. Se lo dice alguien que fue tan ingenuo que penso acabaria en tres meses y ya llevo mas de dos años. animoooooo
Los prototipos dominarán el mundo
Lo que entiendo es que esta implementación nueva con class viene para ser un poco mas amigable con las funciones constructoras pero todo sigue funcionando de la misma forma. 😮
Juan es un capo explicando. Muy bien
Clases en JavaScript
Las clases son en realidad prototipos de JavaScript, azúcar sintáctica para hacer más amigable para trabajar con prototipos.
class studentWithClass {
constructor (name, age, approvedCourse) {
this.name = name;
this.age = age;
this.approvedCourse = approvedCourse;
}
passCourse () {
this.approvedCourse.push(newCourse);
}
}
// Instanciar objeto a partir de una clase
const arthur = new studentWithClass (
'Arthur Licona',
38,
[
'Introducción a la POO', 'POO con JavaScript', 'JavaScript Practico', 'Manupulación de DOM'
],
)
Les dejo mi código de la clase:
class Student {
constructor({ name, age, approvedCourses, email }) {
this.name = name;
this.age = age;
this.email = email;
this.approvedCourses = approvedCourses;
}
approveCourse(course) {
this.approvedCourses.push(course);
}
}
const JUAN = new Student({
name: 'Juan David Castro',
age: 18,
email: '[email protected]',
approvedCourses: [
'Cómo Conseguir Trabajo en Programación',
'Curso Básico de Programación Orientada a Objetos con JavaScript',
],
});
console.log(JUAN);
Tambien les dejo mi repositorio del curso: https://github.com/UltiRequiem/oop-js-platzi 😃
El profe juan es increíblemente bueno explicando, sabe como hacer para que no te aburras
AQUÍ EL RESUMEN:
La sintaxis de clases en JavaScript se introdujo en ECMAScript 2015 (también conocido como ES6) y es una forma más conveniente de definir clases y trabajar con herencia en comparación con la antigua forma de prototipos
class student2 {
constructor (name, age, cursosAprovados ){
this.name = name;
this.age = age;
this.cursosAprovados = cursosAprovados;
}
aprovarCursos(nuevoCursito){
this.cursosAprovados.push(nuevoCursito)
}
}
const miguelito = new student2("miguel", 22 , "ni el bachillerato aprovó")
constructor
es un método especial dentro de una clase que se ejecuta automáticamente cuando se crea una nueva instancia de la clase.student2
, el constructor acepta tres parámetros (name
, age
, y cursosAprovados
) y asigna esos valores a las propiedades correspondientes de la instancia actual (usando this
).aprovarCursos
:
aprovarCursos
en tu clase student2
.nuevoCursito
) y lo agrega al array cursosAprovados
de la instancia actual.student2
llamada miguelito
mediante const miguelito = new student2("miguel", 22, "ni el bachillerato aprovó")
.name
, age
, y cursosAprovados
durante la creación de la instancia.En cuanto a tu pregunta sobre por qué el método no se hace como un prototipo, en realidad estás utilizando la sintaxis de clases, que proporciona una manera más declarativa de definir métodos y propiedades. Sin embargo, internamente, todavía se están utilizando los prototipos de JavaScript.
En la antigua forma de trabajar con prototipos, el método aprovarCursos
se habría agregado al prototipo de la función constructora, y todas las instancias compartirían ese mismo método desde el prototipo. Con la sintaxis de clases, esto se maneja de manera más legible y orientada a objetos.
En resumen, tu código utiliza la sintaxis de clases de JavaScript para definir una clase student2
con un constructor y un método. La instancia miguelito
se crea utilizando esta clase, y puedes acceder y manipular sus propiedades y métodos de manera más clara y estructurada.
Lo que estás viendo en el código es una técnica llamada “desestructuración de objetos” utilizada en el constructor de la clase student2
. La desestructuración de objetos es una característica de JavaScript que permite extraer propiedades específicas de un objeto y asignarlas a variables individuales.
class Student2 {
// Constructor de la clase que utiliza la desestructuración de objetos como parámetro
constructor({
name, // Extraer la propiedad 'name' del objeto
age, // Extraer la propiedad 'age' del objeto
cursosAprovados // Extraer la propiedad 'cursosAprovados' del objeto
}) {
// Asignar las propiedades extraídas a las propiedades de la instancia
this.name = name;
this.age = age;
this.cursosAprovados = cursosAprovados;
}
}
// Ejemplo de creación de una instancia de la clase utilizando un objeto como argumento
const miguelito = new Student2({
name: "Miguel",
age: 22,
cursosAprovados: ["Curso1", "Curso2"]
});
// Ahora, miguelito tiene las propiedades asignadas según el objeto proporcionado
console.log(miguelito.name); // "Miguel"
console.log(miguelito.age); // 22
console.log(miguelito.cursosAprovados); // ["Curso1", "Curso2"]
En este caso, el constructor de la clase Student2
espera un objeto como parámetro. Este objeto debe tener propiedades llamadas name
, age
, y cursosAprovados
. Al crear una instancia de la clase, proporcionas un objeto con estas propiedades. La desestructuración de objetos en el constructor extrae automáticamente esas propiedades del objeto proporcionado y las asigna a las variables correspondientes en el contexto del constructor.
En resumen, esta técnica hace que la creación de instancias sea más flexible y legible, ya que puedes proporcionar propiedades en cualquier orden y no estás limitado al orden en que se definen en el constructor.
La desestructuración de objetos utilizada en el constructor de la clase ofrece varias ventajas:
Tan bonito que es el orden y en los cursos el profe Juan se lo pasa por los 🥚🥚🐣😥 una verdadera lástima. Para mí, al explicar algo se debe tener muy en cuenta el orden para tener mayor comprensión de cada tema. Si metes todo en un mismo archivo, todo se hace engorroso, tedioso, aburrido, estresante…
Es incómodo ver un curso cuando tiene líneas que sobrepasan el espacio del editor, esto oculta la información que se está mostrando o tratando de explicar, esto lo veo incluso en cursos actuales, tal parece que aún no conocen el "editor.wordWrap": "on",
en los settings de VSC, bueno, se los presento 😅.
"editor.wordWrap": "on", 👈👀
Provengo del lenguaje Java, por lo que la idea de clases y objetos no es extraña para mí. Pero esta forma de crear el constructor, con el patrón RORO, me recuerda a los parámetros nombrados del lenguaje Dart.
Una clase también puede tener parámetros por defecto sin aplicar RORO
La sintaxis utilizada en el constructor de la clase Student se conoce como “destructuring assignment” o “asignación por desestructuración” en español.
Se utiliza esta sintaxis para permitir que el objeto que se pasa como argumento al constructor se pueda desestructurar y asignar los valores de sus propiedades a variables individuales. Esto hace que el código sea más legible y fácil de entender.
Además, al utilizar esta sintaxis se pueden establecer valores predeterminados para las propiedades del objeto que se pasa como argumento. En el ejemplo, se establece el valor predeterminado de cursosAprobados como un array vacío.
Lo cool es que puedes utilizar la misma sintaxis de los prototipos para añadir métodos a las instancias:
\
class Dog {
constructor(name, power) {
this.name = name;
this.power = power;
}
miau() {
console.log(`I'm ${this.name} and I'm a dog and I don't "miau". I have the power of ${this.power}`);
}
}
const skill = new Dog("Skill", "The Force");
console.log("Class:", Dog, "instance:", skill);
skill.notFromProto = "Not from .prototype";
console.log(skill);
skill.miau();
Dog.prototype.withProto = function () {
console.log("Now class with proto,", this.name);
}
skill.withProto();
Dog.prototype.notRecommended = function () {
console.log(`Now, I will be referencing something that only exist in Skill: ${this.notFromProto}`);
}
const value = new Dog("Value", "Super bark");
skill.notRecommended();
value.notRecommended();
Mi mundo se iluminó!!! ❤️
Las clases son una sintaxis mas amigables para trabajar con prototipos, es decir las clases por dentro son prototipos en Javascript con una sintaxis muy parecida a los lenguajes basados en programacion orientada a objetos
Según la definición de la tecnología, esta es utilizada para satisfacer las necesidades de las personas, incluyendo facilitar el trabajo.
Entonces si bien la sintaxis de clase es lo mismo que la sintaxis original, que es como trabaja JS, esta ayuda a facilitar la forma de trabajar con objetos.
Por lo que a mi punto de vista es mejor trabajar de esta manera, pero también es necesario comprender cómo funciona realmente algo.
Sin embargo no importa la forma en que lo hagas, lo importante es que sepas cómo funciona y hacerlo bien.
class Materia{
constructor({
nombre,
maxEstudiantes,
listaEstudiantes=[],
profesor = null,
}){
this.nombre= nombre;
this.maxEstudiantes= maxEstudiantes;
this.listaEstudiantes = listaEstudiantes
this.profesor=profesor;
}
inscribirEstudiante(estudiante){
if (this.listaEstudiantes.length<this.maxEstudiantes && this.listaEstudiantes.includes(estudiante)==false){
this.listaEstudiantes.push(estudiante);
}else{
console.log("El estudiante ya esta inscrito");
}
}
retirarEstudiante(estudiante){
let posicion;
for (const estudiante in this.listaEstudiantes) {
if(estudiante==this.listaEstudiantes[estudiante]){
posicion=parseInt(estudiante);
}
}
this.listaEstudiantes.splice(posicion,1);
}
}
Excelente clase, se aprende un montón y más con la forma en que Juan hace ver las cosas.
Aqui esta mi codigo de esta clase:
// Little Platzi
class AnotherStudent {
constructor(namer, ager, coursesApproved, email = '@social') {
this.name = namer;
this.age = ager;
this.coursesApproved = coursesApproved;
this.email = email;
}
approveCourse(course) {
this.coursesApproved.push(course);
}
}
class Student {
constructor({namer, ager, coursesApproved, email = '@social'}) {
this.name = namer;
this.age = ager;
this.coursesApproved = coursesApproved;
this.email = email;
}
approveCourse(course) {
this.coursesApproved.push(course);
}
}
const anotherWalker = new AnotherStudent('Walker', 24, ['Are you ok, Annie', 'Smooth Criminal']);
const walker = new Student({ email: "[email protected]", namer: 'Walker', ager: 33, coursesApproved: ['Are you ok, Annie', 'Smooth Criminal']});
ayuda mucho mandar en objeto como parámetro a nuestra clase XD
Esto es una característica relativamente nueva de JS, ¿No?
Excelente profesor, muy esmerado en explicar al detalle!
Buen dia campeon… excelente explicacion, gracias…
el patron de programacion, no se si lo escribi bien, si alguien sabe la correcta escritura por twitter.
class Student2 {
constructor({
name,
age,
approvedCourses,
email,
facebook = "",
twitter = "",
instagram = "",
}) {
this.name = name
this.age = age
this.approvedCourses = approvedCourses,
this.email = email
this.facebook = facebook
this.twitter = twitter
this.instagram = instagram
}
approveCourse(newCourse) {
this.approvedCourses.push(newCourse)
}
}
// Creando una nueva instancia de la clase Student2
const miguel = new Student2({
name: "Miguel",
age: 20,
email: "[email protected]",
approvedCourses: [
"Curso 1",
"Curso 2",
"Curso 3",
"Curso 4",
],
})
miguel.approveCourse("Curso 5")
Class
estara todo ese codigo en github
__proto__
[[Prototype]]
Luego de conocer RORO en esta clase:
Les dejo mi resumen de las clases
https://www.notion.so/Curso-B-sico-POO-JS-8b1ae724db364a06b5cac3055526c7b1
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?