No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Instance Of en JavaScript con instancias y prototipos

17/20
Recursos

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.

  1. 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.

  2. 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({ // 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,
    	};
    
    	// Preguntamos primero si el parámetro recibido "learningPaths" sí es un Array:
    	if (isArray(learningPaths)) { // 👈👈
    		// Momentaneamente hacemos esta asignación hasta realizar el resto de
    		// validaciones:
    		this.learningPaths = [];
    
    		// Vamos a recorrer cada índice del Array "learningPaths"
    		for (learningPathIndex in learningPaths) { // 👈👈
    
    			// Preguntaremos si el elemento ubicado en el índice actual es una
    			// instancia del prototipo LearningPath. Solo así sabremos si es una
    			// verdadera ruta de aprendizaje:
    			if (learningPaths[learningPathIndex] instanceof LearningPath) { // 👈👈
    
    				// Si es que SÍ es una instancia de dicho prototipo, entonces agregamos
    				// dicha ruta de aprendizaje al array "learningPaths" del estudiante:
    				this.learningPaths.push(learningPaths[learningPathIndex]);
    
    			} // If end
    		} // For end
    	} // If end
    
    }
    

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:

// Creamos nuevas rutas de aprendizaje que son instancias de "LearningPath"
const escuelaWeb = new LearningPath({
	name:"Escuela de WebDev"
});
const escuelaData = new LearningPath({
	name:"Escuela de Data Science"
});

// Generamos un nuevo estudiante asignandole las rutas creadas hace un momento, pero
// además agregamos un objeto con el nombre de una escuela al azar la cual a pesar de
// que tenga los mismos atributos, NO es instancia del prototipo LearningPath
const juan = new Student({
	email:"[email protected]",
	name:"Juanito",
	learningPaths:[
		escuelaWeb,
		escuelaData,
		{
			name: "Escuela Impostora"
		}
	]
});

// Si observamos en consola las rutas que tiene el estudiante creado, no nos aparecerá
// aquella "Escuela Impostora" que intentamos agregar, esto debido a que no pasó las
// Validaciones que establecimos:
console.log(juan.learningPaths);

/* > Mensaje en consola: 👀
[
  LearningPath {
		name: 'Escuela de WebDev',
		courses: []
	},
  LearningPath {
		name: 'Escuela de Data Science',
		courses: []
	}
]
*/

Ahora bien, aprendamos a generar atributos y métodos privados en prototipos. ¡Let’s go! 👨‍💻🕵️‍♀️

Contribución creada por: Martín Álvarez (Platzi Contributor)

Aportes 51

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

También pudimos haber usado el for ... of en lugar del for ... in para no hacer el código tan verboso.

.
For … in devuelve los indices o las llaves del array u objeto que esta siendo iterado.
For … of devuelve ya directamente los valores.

.
Personalmente, por esa misma razón casi siempre me gusta dejar exclusivamente el for ... in para objetos y el for ... of para arrays.

.
Aun asi, al final va a depender del resultado que queramos obtener.

.

Este curso fuera menos confuso si trabajara en documentos distintos, en vez de comentar y estar deslizando como loco buscando donde tiene que corregir. Una sugerencia para los demás cursos

Creo que lo que pasaba, cuando el profesor estaba tratando de corregir la primera forma en que trato de resolver lo de LearningPaths, fue un error de paréntesis 👀😢.

En la clase se vio así:

for (learningPathKey in learningPaths) {
    if (!learningPaths[learningPathKey] instanceof LearningPath) {
      console.warn(`Hay un learningPath no es una verdadero LearningPath`);
      return;
    }
}

El problema de la validación era en línea de código de la condición if. Lo que pasaba es que se estaba negando el objeto en si, no el valor que se estaba retornando instanceof.

if (!learningPaths[learningPathKey] instanceof LearningPath)

Si se agregan los paréntesis para envolver esa condición, se esta negando el valor que retorna instanceof y se logra que no sea posible crear un Student si algún learningPath no es un verdadero LearningPath 🧐😬

if (!(learningPaths[learningPathKey] instanceof LearningPath))

este curso esta muy confuso :C

ni dios sabe que es learningpaths

Todos al ver el código de la clase.

Hola! como estan? Les dejo un pequeno resumen de lo aprendido!

Instance OF en js con instancias y protipos.

Convertiremos nuestras fabricas de objetos en prototipos y gracias a crear prototipos,utilizaremos el instance of para ver si ej nuestros learning paths realmente fueron creados con el prototipo learningpath, es decir, si realmete son instancias de este prototipo o en realidad son imitadores.

RECORDA que para crear prototipos, debemos usar la palabra this y new

Pondre como funciona el codigo completo y luego lo ire explicando de a poco.

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.name = name;
    this.email = email;
    this.age = age;
    this.approvedCourses = approvedCourses;
    this.socialMedia = {
        twitter,
        instagram,
        facebook,
    };    

    if (isArray(learningPaths)) {
      this.learningPaths = [];
/* lo que hago con if (isArray(learningPaths)) {
      this.learningPaths = []; es entenderm yo pido el argumento learningPaths, la pc lo almacena en el objeto que esta ahi arriba en student({}),luego de eso valido todos los datos ejempllo this.name = name; ahora me queda validar los learningPaths y le digo, che pibe, no me intersa lo que tenes adentro, te voy a validar que sos un array, uh si, sos un array, pero se que sos un array vavio, por lo tanto ire veindo con un bulce CADA UNA DE TOS PROPIEDADES, y las que cumplan ser instancia de LEARNING PATHS te lo metere con un push.*/      

      for (learningPathIndex in learningPaths) {
        if (learningPaths[learningPathIndex] instanceof LearningPath) {
          this.learningPaths.push(learningPaths[learningPathIndex]);
        }
      }
    }

  }
  
  const escuelaWeb = new LearningPath({ name: "Escuela de js" });
  const escuelaDataScience = new LearningPath({ name: "Escuela de data science" });

  const juan = new Student({ 
    email: "[email protected]",
    name: "Juanito",
    learningPaths: [
      escuelaWeb,
      escuelaDataScience,
  ]
  });
  1. Como funciona el instanceof ⇒ Es importante saber que es un metodo que devolvera true o false.
function LearningPaths({
  name,
  courses = [],
}){
  this.name = name;
  this.courses = courses;
}
//el LearningPaths es mi prototipo

let desarrolloweb = new LearningPaths({
  name: "desarrollo web",
  courses: ["mates", "js", "guitarra"]
});

//desarrollo web es una instancia de LearningPaths, eso lo hago gracias al    new.

let funValidate = (a,b) => {
	let x = a instanceof b;
  console.log(x)
}

funValidate(desarrolloweb, LearningPaths)
//esto de aca arriba es la funcion de validacion, en esta hice el instanceof, como se puede ver, estoy validando si desarrolloweb es una instancia de learninghPaths. la respuesta es un //true.

Empezamos con el codigo

//Aca simplemente declare 2 prototipos, el LearningPath, y Student.

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.name = name;
    this.email = email;
    this.age = age;
    this.approvedCourses = approvedCourses;
    this.socialMedia = {
        twitter,
        instagram,
        facebook,
    };    
//Que sucede aca? Facil, la idea es que yo le pido toda la data al usuario de su ruta, y le pido en los argumentos de la funcion Student que me pase un     parametro de lo que sera su learningPaths, yo solo SE LO PIDO, pero NO LO TRABAJO, como a los otros.
if (isArray(learningPaths)) {
      this.learningPaths = [];      

      for (learningPathIndex in learningPaths) {
        if (learningPaths[learningPathIndex] instanceof LearningPath) {
          this.learningPaths.push(learningPaths[learningPathIndex]);
        }
      }
    }
  }
//Genial! ya el usuario nos debio pasar sus parametro learningpath,entonces esste codigo trbajare este parametro,si? bien lo primero que haremos con ese dato que no paso es decir con learningPaths, es verificar si es un array, es un   array? si lo es, entra a lo que sucede dentro, y lo primero que se hace es el  this.learningPaths = []; este afirmara que es un array, es neceario para guardar la data. luego de eso entramos a un bucle, un bucle bellisimo. Que hara este? facil, el con la variable learningPathIndex, agarrara cada dato de el array learningPaths, de esta manera => learningPaths[learningPathIndex]. por cada interracion esto learningPaths[learningPathIndex] cambiara, ya que solo es una variable del array. ahora por cada elemento, se vera si son instancias del LearningPath, que es nuestro prototipo. Por cada vez que ses verdadero, meteremos en el array learningPaths, esto learningPaths[learningPathIndex]. es decir, el elemento del array que respete tal condicion que hemos escrito.

ufff cuantas veces habra dicho Learning paths??? 😅

Esta clase me recordo a esto:
-Hola soy el señor LearningPath, mirenme y voy a ayudarte con tus learningPaths!
-No yo soy el señor learningPath y yo voy a ayudarte con tus learningPaths!

Concuerdo con muchos compañeros en que alguunas clases de este curso han sido muy confusas por el hecho de copiar, pegar, comentar, borrar, scrollear el codigo, además de que en esta clase específicamente el profe uso la variable learningpaths tantas veces (con mínimas variaciones) que no se sabe a que se asigna si todo el tiempo es learnigpaths, se hace mas confuso y enredado entender para los que recién vemos estos temas.
Critica constructiva que ojalá puedan mejorar en próximos cursos esos detalles, ya que el profe se nota que le pone todas las ganas y energía y lo transmite, pero esos detalles hacen que la clase se haga confusa.

Esta clase necesita volver a ser grabada, necesitan ser más crticos con el material de enseñanza, una tercera parte de la clase es Juan diciendo learning path(s) una y otra vez!

instanceof

El operador instanceof verifica si un objeto en su cadena de prototipos contiene la propiedad prototype de un constructor

objeto isntacneof constructor

En la documentación de los recursos me percaté que existen dos maneras de usar el new
.

  • La primera en forma de Operador.* El cual permite a los desarrolladores crear una instancia de un tipo de objeto definido por el usuario o de uno de los tipos de objeto integrados que tiene una función constructora
function Car(make,model,year) {
    this.make = make;
    this.model = model;
    this.year = year;
}
const car1 = new Car('Honda', 'Civic', '2000');

console.log(car1.make);// Honda

// sintaxis

new constructor[([arguments])]

constructor. Una clase o función que especifica el tipo de instancia del objeto.
arguments. Una lista de valores con los que se llamará al constructor.

La palabra new hace lo siguiente:

  1. Crea un objeto avascript simple y en blanco;
  2. vincula (establee el constructor de) este objeto a otro bojeto;
  3. Pasa el objeto recién creado del paso 1 como contexto this;
  4. Devuelve this si la función no devuelve un objeto.
    La creación de un objeto definido por el usuario requiere dos pasos:
    1. Defina el tipo de objto escribiendo una función
    2. Crea una instancia de objeto new
  • new.target. Esta propidad nos permite detectar si una función o constructor fue llamado usando el operador new. En constructores y funciones instanciadas con el operador new, new.target devuelve una referencia al constructor o función. En llamadas a funciones normales, new.target es undefined

Ni viendo 3 veces el video sé cual learning path usar

Este ha sido el curso que mas enredos me ha causo en especifico este video 😦

Creo que esta clase me ha aumentado el deseo de aprender mejor TypeScript.

¡Rayos!! Me he vuelto un ocho tratando de copiar y borrar y mover código. No estoy entendiendo bien

Con todo respeto siento que al profesor se le fue de las manos el código y termino enredándose en el quid de la clase e intentar explicarlo. Deberían recortar las partes en las que el profesor se equivoque, y aunque ciertamente verlo cometer fallas concite la reflexión de los estudiantes en varios conceptos esta no deja de ser una clase de instanceof.
Si el motivo principal de la clase es explicar instanceof y su aplicación en un contexto real, realmente no hay necesidad de hacer una clase excesivamente larga, donde se pasa más tiempo acomodando código y redundando en conceptos que en explicar el motivo principal.
Esta clase pudo ser hecha en muchísimo menos tiempo y evitar generar confusiones y circunloquios innecesarios.
Repito: Hago este comentario desde el prisma más amigable y constructivo críticamente hablando que se pueda

Les propongo un juego: un shot por cada vez que el profe diga learning path

Que mareada me acaba de pegar con ese codigo gigante todo comentado y los malditos learningPath…

Muy complicado de seguir, y eso que tengo algo de experiencia con JavaScript.

Si escribimos debugger en donde haríamos el console.log podríamos pausar el tiempo de ejecución y ver el valor de las variables, es una muy buena forma de revisar nuestro codigo

las Fabricas de objetos dejaran de serlo para convertirlas en prototipos asi que les borramos les cambiaremos los nombres de : function createLoQueSea {.....} simplmente function loQueSea{....} tambien comentamos por un rato los propiedades public y private de nuestras funciones

// Convirtiendo clase como prototipo
function LearningPath({
    name = requiredParam('name'),
    courses = [],
}) {
    this.name = name;
    this.courses = courses;
}


function requiredParam(param) {
    throw new Error(`${param} es obligatorio`);
}

// Convirtiendo clase como prototipo
function Student({
    name = requiredParam('name'),
    email = requiredParam('email'),
    age,
    approvedCourses = [],
    learningPaths = [],
    twitter,
    instagram,
    facebook,
} = {} ) {
    this.name = name;
    this.email = email;
    this.age = age;
    this.approvedCourses = approvedCourses;
    this.socialMedia = {
        twitter,
        instagram,
        facebook,
    };

    if (Array.isArray(learningPaths)) {
        this.learningPaths = [];
        for (const learningPath in learningPaths) {
            if (Object.hasOwnProperty.call(learningPaths, learningPath)) {
                const element = learningPaths[learningPath];
                // Si cada propiedad es una instancia del prototipo LearningPath
                if (!(element instanceof LearningPath)) {
                    console.warn('Learning Path no es una verdadera instancia');
                    return;
                } else {
                    this.learningPaths.push(element);
                }
            }
        }
    } else {
        console.warn('Learning Path no es un array');
        return;
    }
}

class Hola {
    constructor(name, courses) {
        this.name = name;
        this.courses = courses;
    }
}

const escuelaDW = new LearningPath({ name: 'Escuela de Desarrollo Web' });
const escuelaDS = new LearningPath({ name: 'Escuela de Data Science' });

const carlos = new Student({
    name: 'Carlos',
    email: '[email protected]',
    twitter: 'cerm_88',
    instagram: 'cerm_88',
    facebook: 'cerm88',
    learningPaths: [escuelaDW, escuelaDS, {name: 'impostor', courses: ['Malo']}],
});

// carlos.learningPaths = { name: 'Escuela de desarrolo web', courses: ['HTML']};

console.log(carlos.learningPaths);
Siento que este curso a estado muy confuso, en parte pórque en un mismo archivo se amontona todo el código, en algunos casos tiene sentido pero ya termina siendo demasiado enrredado lo que está haciendo contra lo que ya estaba antes.

Es mucho mas simple el codigo si lo hacemos con for...of ya que no necesitamos especificar el index.
Recomiendo for...in para Objetos y for...of para Arrays

if (isArray(learningPaths)) {
        this.learningPaths = []
      for (let paths of learningPaths) {
          if (paths instanceof LearningPaths) {
            this.learningPaths.push(paths)        
        }
      }
    }

Díficl de entender…pero ahi le damos

Venia super bien hasta esta clase. Todo es muy confuso, seria bueno que mejoraran esta clase… escuche learningPath como 200 veces y no se en si, a que se refería.

vi los videos varias veces pero al final lo unico q funciono fue tratar de hacerlo CASI sin mirar.
demasiado scroll en el video.

Ibamos bien hasta aquí, se desordenó mucho el profe : ( Es mejor trabajar archivos separados por clase, en lo posible.

Deberían de grabar esta clase de nuevo, claro que esta chido que se comentan errores si se aprenda pero se desvía mucho el tema principal que era como usar instanceOf

Lo bueno que están los recursos de cada clase para resumir 😋.

Yo el if lo hice así y sí me funcionó. Me parece que el problema tiene que ver con la precedencia de operadores. El not (!) tiene mayor precedencia que el instanceof

for (elemento of learningPaths) {
    console.log({learningPaths, elemento, isInstanceOf: elemento instanceof LearningPath});

    if(!(elemento instanceof LearningPath)) {
      console.warn("learningPath NO es un verdadero LearningPath");
      return;
    }
  } 
deberían pensar en repetir esta clase, pero con menos confusión, la verdad dan ganas de no ver las que quedan

Este curso de POO INTERMEDIO me dejó una mala sensación, parecería que improvisan, ya que da la sensación que no hacen una validación de calidad antes de publicar un tema, ALGUNOS ERRORES Y POCO DIDÁCTICO.

Amigos, les recomiendo leer en este sitio web como usar instance of en JS.

Viene explicado con un ejemplo más simple de digerir.
Ejemplo de instance of

Pido un dólar por cada vez que el profesor dice LearningPath o LearningPaths

En el minuto 11:07 usa todos los “learning path” y sus variantes que haya creado y parece ser confuso pero no lo es, si solo sigues lo que él hace te vas a confundir porque no sabes a qué hace referencia o porqué lo hace pero si analizas y entiendas la lógica del problema en realidad no hace cosas fuera de lo que ya vimos, todo lo que usa para validar y demás son cosas que ya vimos en videos anteriores. Desarrollar tu lógica junto al profesor y crear tus propias variables y funciones ayuda a aprender mejor.

pd: Si no entiendes lo que hace analiza el código con papel y lapiz 😉, te puede llevar tiempo pero siempre funciona.

learningpaths…learningpaths everywhere…

voy a tener pesadillas con learningPaths
Llevo mucho tiempo tratando de entender este curso, ¡no lo logro, es muy confuso, ese para delante y para atrás me cofunde no tiendo Diosss!!
Yo utilice esta solucion, siento que es un poquito mas limpia ` if (!Array.isArray(learningPaths)) {` ` throw {` ` name: 'MissingParamError',` `` message: `Missing param: learningPaths`,`` ` };` ` }` ` const someNotLearningPath = learningPaths.some(` ` (lp) => !(lp instanceof LearningPath)` ` );` ` ` ` if (someNotLearningPath) {` ` throw {` ` name: 'MissingParamError',` `` message: `Missing param: learningPaths`,`` ` };` ` }`

Acuérdense de instance of porque lo usaran más adelante, creo fue lo más importante de la clase 🙂

El profeso se enredó demas en la parte de recorrer el array. Con un for...of queda mas limpio y se logra lo mismo. Tambien se podria usar un map o incluso un forEach, ya queda a criterio del desarrollador cual usar, pero en este caso for...in hace el codigo menos legible, ya que esta hecho para reccorer objetos. ```js for (lp of learningPaths) { if (lp instanceof LearningPath) { this.learningPaths.push(lp) } } // Utilizando map learningPaths.map(lp => { if (lp instanceof LearningPath) { this.learningPaths.push(lp); } }) ```// learningPaths.map(lp => { // if (lp instanceof LearningPath) { // this.learningPaths.push(lp); // } // }) for (lp of learningPaths) { if (lp instanceof LearningPath) { this.learningPaths.push(lp) } }

De esta manera me funciona, ya que si trato de crear un nuevo estudiante añadiendole una learningPath que no ha sido creado por la función constructora me retorna el console.warn

   if(isArray(learningPaths)){
        this.learningPaths = [];

        learningPaths.forEach(path => {
            if(path instanceof LearningPath){
                this.learningPaths.push(path)
            }else{
                console.warn('Habia una ruta impostora, que ha sido eliminada')

            }
        })
    }

Nueva idea de juego, tomar un shot cada vez que el profe diga “learning path” jajajaja

El video no me quedo muy claro al principio pero leyendo los RECURSOS de la clase entendí el código.
Vi mucho comentario de rehacer el video por que es muy confuso, pero, desde mi punto de vista me pareció genial ver como solucionaba el problema. Ya que de eso se trata la programación, solucionar problemas.
(recuerden también que las clases no solo son videos, también hay documentación en el apartado de recursos y lecturas recomendadas)

LERNINPAS

En esta clase se mencionó más veces “learningPaths”, que el número de neuronas que me quedan😅

La clase es confusa solo me quedo para que funciona el instance of

¿Cuál es el uso de la instance of?

Como sugiere el nombre, instanceof en Java se usa para verificar si el objeto especificado es una instancia de una clase, subclase o interfaz . También se le conoce como operador de comparación debido a su característica de comparar el tipo con la instancia

El operador instanceof en java script comprueba si la propiedad de prototipo de un constructor aparece en algún lugar de la cadena de prototipo de un objeto

Definitivamente necesitan rehacer estos cursos o clases, mas modernos y aplicandolos a un proyecto real.

nose cuantos learning no se que habian en el codigo, muy confuso pero creo que estuvo bien …

Para los que hablan de que la clase fue confusa por tanto scroll, para nada. Además, en la parte de recursos de la clase está el código completo para que se guíen mejor. Buena clase además.