Con instanceof
podemos saber si un objeto es instancia de cierto prototipo. Esto nos devuelve true
o false
.
Determinando la procedencia de un objeto
A partir del código creado anteriormente, realizaremos las modificaciones respectivas para que ahora nuestras funciones generadoras de objetos (como createLearningPath
) sean ahora prototipos. Con ello ya podremos usar instanceof
para identificar si ciertos objetos son instancias de nuestros prototipos, asegurándonos así de que tengan los atributos y métodos necesarios.
-
Convertiremos nuestras funciones createLearningPath
y createStudent
en prototipos. Utilizaremos ahora this
para asignar los parámetros recibidos a las propiedades de los nuevos prototipos y por ahora no trabajaremos con métodos y atributos privados:
function isObject(subject) {
return typeof subject == "object";
}
function isArray(subject) {
return Array.isArray(subject);
}
function requiredParam(param) {
throw new Error(param + " es obligatorio");
}
function LearningPath({ // 👈👈 PROTOTIPO
name = requiredParam("name"), // Campo es obligatorio
courses = [], // Lista de Cursos que pertencen a la ruta de aprendizaje
}) {
this.name = name;
this.courses = courses;
}
function Student({ // 👈👈 PROTOTIPO
name = requiredParam("name"),
email = requiredParam("email"),
age,
twitter,
instagram,
facebook,
approvedCourses = [],
learningPaths = [],
} = {}) {
this.name = name;
this.email = email;
this.age = age;
this.approvedCourses = approvedCourses;
this.socialMedia = {
twitter,
instagram,
facebook,
};
}
La propiedad learningPaths
lo asignaremos luego de haber hecho las validaciones respectivas.
-
Ahora validaremos si nuestras rutas de aprendizaje que vayamos a crear son auténticas, es decir, no solamente se comportan como tal (tienen los atributos y métodos que un learning path debería tener) sino que también son instancias de nuestro prototipo LearningPath
:
function isObject(subject) {
return typeof subject == "object";
}
function isArray(subject) {
return Array.isArray(subject);
}
function requiredParam(param) {
throw new Error(param + " es obligatorio");
}
function LearningPath({
name = requiredParam("name")
courses = [],
}) {
this.name = name;
this.courses = courses;
}
function Student({
name = requiredParam("name"),
email = requiredParam("email"),
age,
twitter,
instagram,
facebook,
approvedCourses = [],
learningPaths = [],
} = {}) {
this.name = name;
this.email = email;
this.age = age;
this.approvedCourses = approvedCourses;
this.socialMedia = {
twitter,
instagram,
facebook,
};
if (isArray(learningPaths)) {
this.learningPaths = [];
for (learningPathIndex in learningPaths) {
if (learningPaths[learningPathIndex] instanceof LearningPath) {
this.learningPaths.push(learningPaths[learningPathIndex]);
}
}
}
}
Ya podemos agregar rutas de aprendizaje a los nuevos estudiantes que generemos. Los learning paths estarán correctamente validados al momento de realizar la asignación:
const escuelaWeb = new LearningPath({
name:"Escuela de WebDev"
});
const escuelaData = new LearningPath({
name:"Escuela de Data Science"
});
const juan = new Student({
email:"[email protected]",
name:"Juanito",
learningPaths:[
escuelaWeb,
escuelaData,
{
name: "Escuela Impostora"
}
]
});
console.log(juan.learningPaths);
Ahora bien, aprendamos a generar atributos y métodos privados en prototipos. ¡Let’s go! 👨💻🕵️♀️
Contribución creada por: Martín Álvarez (Platzi Contributor)
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?