¿Cómo se crean clases en JavaScript usando la sintaxis de ES6?
La programación orientada a objetos (POO) nos permite crear arquitecturas de software organizadas y eficientes. Al usar la sintaxis de clases en JavaScript, podemos crear prototipos reutilizables y jerárquicos que mejoran el mantenimiento y escalabilidad de nuestro código. Exploremos cómo se crea una clase básica utilizando ES6, centrándonos en un sistema de aprendizaje.
¿Qué es una clase y cómo se define?
Una clase en JavaScript es un modelo o "plantilla" para crear objetos con propiedades y métodos compartidos. Se define usando la palabra clave class seguida del nombre de la clase. Las clases pueden contener un constructor, que inicializa objetos a partir de la clase y define las propiedades básicas que necesitarán.
classLearningPath{constructor({ name ='', courses =[]}){this.name= name;this.courses= courses;}}
¿Cómo se crean instancias de una clase?
Después de definir nuestra clase, podemos crear instancias que representen entidades individuales. Al crear una instancia, pasamos las propiedades necesarias en el formato de objeto. Esto permite establecer atributos específicos para cada instanciación.
const webDevelopmentSchool =newLearningPath({name:'Escuela de Desarrollo Web',courses:['Curso Definitivo de HTML y CSS','Curso Práctico de HTML y CSS',],});
¿Cómo organizar mejor los programas con POO?
Un aspecto importante de la programación orientada a objetos es evitar la repetición de código. Esto se logra abstrayendo elementos comunes en clases y utilizando instancias. En nuestro ejemplo de sistema de aprendizaje, los cursos y las clases son ejemplos claros donde la abstracción puede optimizar nuestro código.
Definiendo una clase Curso
En este sistema, los cursos pueden tener múltiples clases. Creamos una clase Course con un constructor que acepta un objeto para definir propiedades como el nombre y las clases incluidas.
Al reutilizar instancias de .Course en diferentes LearningPath, evitamos redundar nombres de cursos y simplificamos su mantenimiento. Si un curso necesita modificarse, solo lo hacemos en un lugar.
const dataScienceSchool =newLearningPath({name:'Escuela de Data Science',courses:[ basicProgrammingCourse,newCourse({name:'Curso de Data Business'}),],});
¿Qué aprender a continuación?
La programación orientada a objetos es vastamente poderosa, y es solo la punta del iceberg. Considere crear más abstracciones para otros elementos como "Comentarios" o "Bloques de contenido" en su aplicación. ¿Qué otras clases crees que necesitarías en una plataforma de aprendizaje como la que estamos construyendo? Desafíate a crear estas clases y convierte tu código en una obra de arte POO.
Recuerda: cada vez que simplificas, reutilizas y organizas tu código, te conviertes en un mejor programador. ¡Sigue mejorando y feliz codificación!
No se si estoy bien o mal pero pienso que los cursos de cierta forma deben de estar ligados al estudiante no?
Ya que tiene la posibilidas de hacer aportes y preguntas incluso el alumno tendría estos métodos 🤔
Pues yo creo que la relacion que comenta herwingx sería mas ligado que un usuario tiene aportes
Creo que se habrán dado cuenta de que tener todo este código en 1 archivo es ineficiente. Así que por ahora, creé diferentes archivos y los estoy mandado a llamar en el main.js :D
Por cierto, para que esto funcione, tienen que hacer este ajuste en index.html: <script src="main.js" type="module"></script>
main.js:
importTeacherfrom'./teacher.js'importCoursefrom'./course.js'importLessonfrom'./lesson.js'importLearningPathfrom'./learningPath.js'importStudentfrom'./student.js'//* Teachers ---------------------constFreddyVega=newTeacher({id:1,name:'Freddy Vega',speciality:'CEO',});console.log(FreddyVega);constClauAlderete=newTeacher({id:2,name:'Clau Alderete',speciality:'Digital Marketing',});console.log(ClauAlderete);//* Lecciones -----------------------const lesson1PB =newLesson({id:1,title:'Clase 1 Programación Básica',});console.log(lesson1PB);const lesson1DM =newLesson({id:2,title:'Clase 1 Marketing Digital',});console.log(lesson1DM);//* Cursos ----------------------------const cursoProgramacionBasica =newCourse({id:1,name:"Curso gratis de programación básica",classes:[lesson1PB],teacher:FreddyVega,});console.log(cursoProgramacionBasica);const cursoIntroMarketingDigital =newCourse({id:2,name:'Curso de Introducción al Marketing Digital',classes:[lesson1DM],teacher:ClauAlderete});console.log(cursoIntroMarketingDigital);//* Escuelas ---------------------const escuelaDesarrolloWeb =newLearningPath({id:1,title:'Escuela de Desarrollo Web',courses:[cursoProgramacionBasica],});console.log(escuelaDesarrolloWeb);const escuelaMarketingDigital =newLearningPath({id:2,title:'Marketing Digital',courses:[cursoIntroMarketingDigital],});console.log(escuelaMarketingDigital);//* Estudiantes ---------------------const miguel =newStudent({id:1,name:'Miguel',email:'miguel@gmail.com',username:'mike',points:40000,approvedCourses:[cursoProgramacionBasica],learningPaths:[escuelaDesarrolloWeb]});console.log(miguel);
Honestamente, trabajar todas las clases en un solo archivo es desesperante. Sobre todo estando tan acostumbrado a los módulos.
Pero en toda nuestra experiencia nos hemos dado cuenta que trabajar en tantos diferentes archivos impacta muy negativamente a estudiantes que recién están iniciando.
De hecho, recuerdo que en el curso de frameworks y librerías de JS mencionaste que el usar tantos archivos fue uno de los puntos que no te convencieron tanto de React.js.
Por eso, aunque en este curso aprendemos a usar los módulos para aplicar encapsulamiento a nivel de archivos, postergamos el uso de módulos más "seriamente" dentro del proyecto para el curso práctico de POO en JS (próximo a grabar).
Qué memoria tan buena tienes Juan 😅 ese Miguel del pasado no estaba acostumbrado a React y ahora tengo mi página web hecha React y todo está muy separado en varios archivos justamente por la facilidad de mantener el código.
Y cuando salga ese curso práctico de POO en JS créeme que estaré aquí comentando mis aportes :D
Hasta este momento creía inecesario usar el diagrama UML, pero ahora veo que si es importante al menos para mi poder ver cada clase dentro de un diagrama me permitira crear codigo mas ordenado ufff
ahora entiendo el por que de los diagramas de clases antes de empezar a tocar codigo, es un diagrama de un proyecto que realice hace algun tiempo, no lo entendia del todo, por que la documentacion es importante, pero cuando vi esta clase, es importante que antes de tocar codigo tengamos por decirlo un manual ya que si hacemos esto alreves no sabremos por donde empezar.
¿Pero ese diagrama no es para una base de datos?, perdón la ignorancia.
Bueno estas son las clases que implementé con respecto a las clases y cursos.
classComments{constructor({user, comment}){this.user= user;this.comment= comment;}}const primerComentario =newComments({user:'Fernando',comment:'Este es el primer comentario'});classClasses{constructor({name, time, comentarios =[]}){this.name= name;this.time= time;this.comentarios= comentarios;}}const primeraClaseProgramacionBasica =newClasses({name:'Que es la programación',comentarios:[primerComentario]});classCourse{constructor({name, classes =[]}){this.name= name;this.classes= classes;}}const cursoProgramacionBasica =newCourse({name:'Curso Gratis de programación Básica',classes: primeraClaseProgramacionBasica});const cursoDefinitivoHTMLyCSS =newCourse({name:'Curso definitivo de HTML y CSS'});const cursoPracticoHTMLyCSS =newCourse({name:'Curso práctico de HTML y CSS'});
Interesante tu forma de estructurar las clases simple y clara (Y)
Por ahora sólo agregué las clases "clases" e "instructor; sin embargo, pienso que aún hacen falta varias por definir, entre ellas:
Comentarios
Aportes
Preguntas
BlogPosts
RutasAprendidas
Foro
Pagos
Planes
Entre quizás otro largo etc.
Por ahora mi código quedó así, está separado por comentarios para que sea más legible.
Cabe mencionar que intenté llamar a mis objetos "clases" en mis objetos "instructor" pero me marca un error de "undefined", porque se declararon posteriormente a la inicialización de estos
Supongo que dicho error se resuelve con módulos pero no estoy seguro, si alguien sabe, por favor haganmelo saber.
El código:
////////////////////////DEFINICIÓN DE LA CLASE INSTRUCTORclassInstructor{constructor({ name, username, courses =[], email, yearsOfinstruction,}){this.name= name;this.username= username;this.courses= courses;this.email= email;this.yearsOfinstruction= yearsOfinstruction;}}const freddyVega =newInstructor({name:"Freddy Vega",username:"Freddier",email:"elgranfreddyv@gmail.com",yearsOfinstruction:12,courses:[cursoProgBasica]});const diegoDGranda =newInstructor({name:"Diego De Granda",username:"DDGranda",email:"DDGranda7898@gmail.com",yearsOfinstruction:6,courses:[cursoDefinitivoHTML, cursoPracticoHTML]});///////////////////////////////DEFICION DE CLASE "CLASE"classClase{constructor({ name, instructor, level,}){this.name= name;this.instructor= instructor;this.level= level;}};const introProg =newClase({name:"¿Qué es la programación?",instructor: freddyVega,level:"Basic"});const asincroProg =newClase({name:"Asínscronismo en la programación",instructor: freddyVega,level:"Advanced"});const queEsHTML =newClase({name:"¿Qué es HTML",instructor: diegoDGranda,level:"Basico"});const semanticaHTML =newClase({name:"Código semántico",instructor: diegoDGranda,level:"Advanced"});const planteamientoProyecto =newClase({name:"¿Qué vamos a hacer en este curso práctico?",instructor: diegoDGranda,level:"Basico"});const ajusteDeDetalles =newClase({name:"Últimos detalles a nuestro proyecto",instructor: diegoDGranda,level:"Advanced"});////////////////////////DEFINICION DE CLASE COURSEclassCourse{constructor({ name, classes =[],}){this.name= name;this.classes= classes;}};const cursoProgBasica =newCourse({name:"Curso de Programación Básica",classes:[introProg, asincroProg]});const cursoDefinitivoHTML =newCourse({name:"Curso definitivo de HTML y CSS",classes:[queEsHTML, semanticaHTML]});const cursoPracticoHTML =newCourse({name:"Curso Practico de HTML y CSS",classes:[planteamientoProyecto, ajusteDeDetalles]});/////////////////////DEFINICION DE CLASE LEARNINGPATHclassLearningPath{constructor({ name, courses =[], coursesNumber, category, instructors =[], projects =[], blogPosts =[], blogPostsNumber,}){this.name= name;this.courses= courses;this.coursesNumber= coursesNumber;this.category= category;this.instructors= instructors;this.projects= projects;this.blogPosts= blogPosts;this.blogPostsNumber= blogPostsNumber;}}const escuelaDeDesarrolloWeb =newLearningPath({name:"Escuela de desarrollo web",courses:[cursoProgBasica, cursoDefinitivoHTML, cursoPracticoHTML],coursesNumber:102,category:"Development and engineering",blogPostsNumber:678,});const escuelaDeEmprendimiento =newLearningPath({name:"escuela De Emprendimiento",coursesNumber:23,category:"Entreprenurship",blogPostsNumber:2,});const escuelaDeMatematicas =newLearningPath({name:"Escuela de matemáticas",coursesNumber:7,category:"Sciences",blogPostsNumber:6,});const escuelaDeVideojuegos =newLearningPath({name:"Escuela de Videojuegos",courses:[cursoProgBasica, cursoDefinitivoHTML, cursoPracticoHTML],coursesNumber:17,category:"Development and Engineering",blogPostsNumber:32,});/////////////////////DEFINICION DE CLASE ESTUDIANTEclassStudent{constructor({ name, email, username, twitter =undefined, instagram =undefined, facebook =undefined, approvedCourses =[], learningPaths =[],}){this.name= name;this.email= email;this.username= username;this.socialMedia={twitter: twitter,instagram: instagram,facebook: facebook,};this.approvedCourses= approvedCourses;this.learningPaths= learningPaths;}}const juan2 =newStudent({name:"JuanDC",username:"juandc1",email:"juanito20@gmail.com",twitter:"fjuandc",learningPaths:[escuelaDeDesarrolloWeb, escuelaDeMatematicas],});const miguelito2 =newStudent({name:"Miguelito",username:"Miguelonazo",email:"juanito20@gmail.com",instagram:"miguelito@gmail.com",learningPaths:[escuelaDeEmprendimiento, escuelaDeVideojuegos],});
Me encanta :clap:
Asi seria mi diagra de clases UML de platzi. Que opinan? 
@eddomejias en que programa realizaste el diagrama?
Recuerdo haber usado StarUML, pero este se ve más cool. ¿Alguien recomienda algún programa de estos?
Abstracción: Es tomar las propiedades más importantes de un objeto, para usarlas de forma general y poder generar nuevos objetos a futuro, en base a las propiedades que tomamos
Aquí ta mi código:
main.js:
importTeacherfrom'./teacher.js';importStudentfrom'./student.js';importLearningPathfrom'./learningPath.js';importCoursefrom'./course.js';const freddy =newTeacher({name:"Freddy Vega"});const juandc =newTeacher({name:"Juan David Castro "});const deGranda =newTeacher({name:"Diego De Granda"})const orlandoB =newTeacher({name:"Orlando Naipes"})const cursoDefHTML =newCourse({name:"Curso Definitivo de HTML y CSS",teacher: deGranda,});const cursoPracHTML =newCourse({name:"Curso Práctico de HTML y CSS",teacher: deGranda,});const cursoPOOJS =newCourse({name:"Curso de Programación orientada a objetos con JavaScript",teacher: juandc,});const cursoUnreal =newCourse({name:"Curso de Unreal Engine",teacher: freddy,});const cursoUnity =newCourse({name:"Curso de Unity 3D",teacher: orlandoB,});const escuelaWeb =newLearningPath({name:"Escuela de Desarrollo Web",courses:[cursoDefHTML, cursoPracHTML ,cursoPOOJS],description:"En esta escuela aprenderás a ser un Desarrollador Web Full Stack"});const escuelaData =newLearningPath({name:"Escuela de Data Science",courses:[cursoDefHTML, cursoUnreal],description:"En esta escuela la neta no sé que hacen"});const escuelaJuegos =newLearningPath({name:"Escuela de Videojuegos",courses:[cursoUnreal, cursoUnity],description:"En esta escuela aprenderás a desarrollar Videojuegos"});const juan =newStudent({nombre:"juanito",username:"juandc",email:"juanito@gmail.com",twitter:"fjuandc_",learningPaths:[escuelaWeb, escuelaData]});const miguel =newStudent({nombre:"miguelito",username:"migueldc",email:"miguel@gmail.com",instagram:"fmigueldc_",learningPaths:[escuelaData, escuelaJuegos]});console.log(miguel);console.log(juan);
// prototypes/constructors/moldsclassLearningPath{constructor({ path_name, courses =[],}){this.path_name= path_name; courses;};};classCourse{constructor({ name,// classes = [],}){this.name= name;// this.classes = classes;}};classStudent{constructor({ name, email, username, twitter =undefined, instagram =undefined, facebook =undefined, approvedCourses =[], learningPaths =[],}){this.name= name;this.email= email;this.approvedCourses= approvedCourses;this.learningPaths= learningPaths;this.socialMedia={ username, twitter, instagram, facebook,};};};classClassForCourse{constructor({ name, id, numberOfClass, comments =[ numComments =0, messages =[],], questions =[], classResources =[ links =[], text =undefined,], nextClass, previousClass,}){this.name= name;this.id= id;this.numberOfClass= numberOfClass;this.comments= comments;this.questions= questions;this.classResources= classResources;this.nextClass= nextClass;this.previousClass= previousClass;}}// Course-lessonsconstFirstLinecodeLesson=newClassForCourse({name:'Mi primera línea de código',id:'BPCC1',numberOfClass:1,comments:[ numComments =16, messages =[],],questions:[],classResources:[ links =[], text ='lorem ipsum in dolor sit amet',],nextClass:'¿qué es HTML/CSS/JS?',previousClass:'',})// coursesconstBasicProgrammingCourse=newCourse({name:'Curso de Programación básica',classes:[FirstLinecodeLesson,'¿qué es HTML/CSS/JS?',]})constWebIntroCourse=newCourse({name:'Introducción a la Web',classes:['MBienvenido al Desarrollo Web','¿Cómo empezó todo?',]})constPOOCourse=newCourse({name:'Curso de POO',classes:['¿Por qué aprender Programación Orientada a Objetos?','¿Qué resuelve la Programación Orientada a Objetos?',]})// gradesconst webDevelopmentGrades =[BasicProgrammingCourse,WebIntroCourse,POOCourse,];constExclusiveCoursesGrades=['Cómo Conseguir Trabajo en Programación','Curso de Finanzas para Startups','Curso de Inglés Técnico para Profesionales'];const pythonDevGrades =[BasicProgrammingCourse,WebIntroCourse,POOCourse,'Curso de Fundamentos de Web Scraping con Python y Xpath','Curso de Introducción al Pensamiento Computacional con Python',];// Collegesconst pythonDevelopmentCollege =newLearningPath({path_name:'Escuela de Desarrollo en Python',courses: pythonDevGrades,})const webDevelopmentCollege =newLearningPath({path_name:'Escuela de Desarrollo Web',courses: webDevelopmentGrades,});constExclusiveCoursesCollege=newLearningPath({path_name:'Cursos Exclusivos',courses:ExclusiveCoursesGrades,});// studentsconst andres =newStudent({name:'Andrés',username:'altair__6',email:'andres@mail.com',instagram:'altair__6',learningPaths:[ pythonDevelopmentCollege ],})const felipe =newStudent({name:'Felipe',username:'Jaya__9',email:'felipe@mail.com',instagram:'Jaya__9',twitter:'Jaya__9',learningPaths:[ webDevelopmentCollege,ExclusiveCoursesCollege],})
·
PD: Lo que me puedan corregir, excelente!
UML basico, segun lo que entendi acerca de UML
Soy un novato en JS. Me salió esto;
Está bastante bien Rubén, de hecho podrías inclusive crear una nueva clase que sea el curso en sí (Ej: Course) e introducirlo como un objeto cuando instancies la clase de LearningPath
Así quedo mi código para construir las "clases de los cursos", e introduciéndolos en el curso correspondiente.
Creo que entre mas vayamos hacia cada elementos mas clases pueden hacerse, por el momento para cada clase suss atributos serian el nombre, comentarios, preguntas, rescursos, clases relacionadas, siguiente clase , clase anterior. Por lo que veo en el reproductor de Platzi :D
classClassesForCourse{constructor({ name, comments =[], questions =[], resourses =[], relatedClasses =[], nextClass, pastClass
}){this.name= name,this.comments= comments,this.questions= questions,this.resourses= resourses,this.relatedClasses= relatedClasses
this.nextClass= nextClass
this.pastClass= pastClass
}}const claseQueEsHTML =({name:"¿Que es HTML/CSS/JS"})const clasePrimerLineaCodigo =({name:"Mi Primer Linea de Código",nextClass: claseQueEsHTML
})classCourse{constructor({ name, classes =[],}){this.name= name;this.classes= classes;}}const cursoProgBasica =newCourse({name:"Curso Gratis de Programación Básica",classes:[ clasePrimerLineaCodigo, claseQueEsHTML
],})
Y no falto el operador new en las instancias de las clases?
Quiero saber si entendí bien esto, la razón de pasar como parámetro un objeto en vez de los atributos por deparado es para poder darles un valor por defecto, para que puedan ser opcionales, y para que puedan ser objetos compuestos por otros objeto o por arrays de objetos, etc? Osea no podria hacer todo eso si no es un objeto?
¡Exactamente, Dani! Técnicamente también podríamos hacerlo si los parámetros no fueran todos propiedades de un mismo objeto. Pero la sintaxis sería más... tediosa y difícil de leer.
«me costó escribirlo, pero ahora solo voy a tener que escribirlo una vez» creo que es el anthem de la programación.
Desde que empecé a aprender siempre me ha recordado a esa máquina complicadísima que fabrica un inventor para hacerse el desayuno. Habrá tardado meses en diseñarla, pero no volverá a levantarse antes por preparar tostadas.
Don't repeat yourself
Una abstracción, por lo que ví, es la agrupación de características comunes de elementos frecuentes.
Se crea una clase o "model" que asegure la consistencia y reproducibilidad de dichos elementos.