Volvimos con nuestro programa que crea Winstons pero he agregado un nuevo tipo de objeto "Hopper" porque Hopper se sentía un poco solo. Así ahora defino "Hopper" de la misma forma que defino "Winston", tu sabes, empezando con la función constructora y tomando las mismas propiedades y después "dibujar" y después "hablar" y después agrego otro método llamado "Hooray" porque a los "Hoppers" les gusta celebrar y a los "Winstons" nó. Ahora, abajo de la función he creado 2 nuevos objetos "Hopper": el pequeño Hopper y el grán Hopper y los dibujo y llamo la función "talk" (hablar) en uno y "Hooray" en el otro. Eso es excelente. Ahora, si vemos éste codigo aquí arriba notarás algo interesante. Es que el código para l "Hopper" es muy similar al codigo para "Winston". Particularmente el constructor. No sé si recuerdas pero ésa es basicamente el mismo código del constructor de "Winston" Y después la función "talk" (hablar) es igual al "talk" del Winston. y ambos tienen función "draw" (dibujar). así que hay muchas cosas en común acerca de estos dos tipos de objetos y tiene sentido porque sabes que Hopper y Winston son 2 tipos de objeto muy similares en nuestro mundo. Si lo consideras, sabes, el mundo real fuera de la computadora muchos objetos comparten similaridades con otros tipos de objetos. Como en el reino animal. Todos los animales son simliares en algunas formas. Y después tenemos diferentes tipos de animales como los humanos. Y los humanos comparten esas similarides pero tambien tienen sos propias similaridades únicas. Así que podríamos decir que un animal es un tipo de objeto del cual el tipo de objeto "humano" hereda funcionalidad. No empezamos de cero, sino agregamos a la funcionalidad que ya tenemos de ser un animal. como todos los animales que hacen ruido. pero los humanos tambien tienen lenguaje Así que este tipo de herencia de objetos es realmente útil en la programación también. y podemos crear una cadena de herencia de objetos en nuestro Javascript Así para hacer esto cuando piensas en lo que comparten nuestros objetos. Y se te ocurre un nombre para ella. porque vamos a crear un nuevo tipo de objeto que representa el objeto base así que llamémoslo "Creature" (criatura) ambos son criaturas Así que decimos "var creature =" y ahora necesitamos nuestra función constructora. Vamos y simplemente copiemos la del "Hopper" que igual a la de "Winston" Está bien y despues... vamos ahora quiero... ¿Qué queremos ahora? Talvez queremos agregar la función de arriba y solo copiamos la de "Hopper". Pero por supuesto que necesitamos tenerla en el prototipo de la "Creature" en vez de eso. OK, excelente. ahora tenemos el tipo de objeto "creature" (criatura). Pero necesitamos decirle a "Hopper" que debería basar su funcionalidad según "Creature". Podemos hacer eso escribiendo ésta línea y diremos "Hopper.prototype" es igual a "object.create" "creature.prototype" Lo que hace esta linea es decirle a Javascript que base la funcionalidad del prototipo de "Hopper" en la del prototipo de "Creature". y eso significa que cada vez que busque una función en "Hopper", buscara el prototipo de Hopper primero, pero si no lo encuentra entonces buscara en el prototipo de "Creature". Y eso es lo que llamamos una cadena de prototipos. Ahora, una vez que hemos hecho esto deberíamos de poder borrar la funcion "talk" en "Hopper" Porque ya existe en "Creature". He está mas arriba en la cadena del prototipo. Listo? ¡Funcionó! Y funciona porque encuentra la función en el prototipo de "Creature". Intentémoslo borrándolo en "Winston" también. OK. No funcionó porque dice que no tiene método "talk". ¿Porqué es eso? Bueno, tenemos nuestro constructor "Winston" y "draw" y eliminamos el "talk". Bueno, notarás que se nos olvidó decirle al prototipo de "Winston" decirle que se base en el prototipo de "Creature". Necesitamos esa línea muy importante "Winston.prototype=object.create" "creature.prototype." :) Y notamos algo importante. Tengo ésta línea después de la función constructora pero antes de agregar cualquier otra cosa al prototipo constructor. Eso es algo que usualmente quieres hacer. Debes decírselo justo cuando empiezas inmediatamente. esto es en lo que se basará tu prototipo inicial Pero después seguimos agregando mas cosas a su prototipo Porque podría habar algo que es único a los "Winstons" o "Hoppers" que no está en los "Creatures". Y es muy bueno que también puedes definir eso. Esta bien. Ahora, si miramos esto, todavía hay código repetido el código constructor. ¿Verdad? Lo tenemos 3 veces. ¿Podríamos borrarlo? Intentémoslo. OK. MMM... no parece haber funcionado. Porque nuestro "Hopper" salió en el rincón superior izquierdo y parece habérsele olvidado lo demás. Ésto es porque Javascript no asume que quieres el mismo constructor aún si quieres basar el prototipo de allí. Te permite definir tu propio constructor para éstos objetos. Pero también te da una forma fácil de llamar un constructor de un objeto. La forma en que haremos esto es escribiendo "Creature.call, this, [apodo], [edad], x, y" Ahora, lo que esto hace (Nota que funciono. ¡Sí!) Y lo que hizo es que ahora esta llamando la funcion "Creature", su función constructora Está llamando la función pero esta pasando y diciendo: "OK, debes llamar este constructor como si.. ...estuviera siendo llamada del objeto 'Hopper'" y como si está siendo llamado con éstos argumentos. Éstos son los argumentos con los que se llamó "Hopper" Y eso acabará ejecutando el código como si estuviera allí mismo. Que es lo que queremos. Y funcionó. y podemos proceder y hacer una copia de ésta línea en el constructor de "Winston" también. Y funciona. :D Esta bien. Miremos esto. Hemos encapsulado todas nuestras propiedades compartidas y funcionalidades en un solo objeto base, "Creature". Y hemos hecho 2 tipos de objeto que extienden el objeto base. Heredan la funcionalidad pero agregan la propia suya también. Y lo excelente es que podemos cambiar la funcionalidad compartida en un solo lugar Como si quisiéramos cambiar la edad de nuevo podríamos agregar el texto "years old" (años de edad). Ahora todos dicen "years old" al final. O Podríamos la función "talk" y decir "woo". Y Ahora los "Winstons" y "Hoppers" dirían "sup". Ahora que has visto como crear tipos de objetos y heredar de otros tipos puedes empezar a pensar en como esto podría ser útil en tus dibujos y animaciones y simulaciones y juegos. Por ejemplo, talvez tienes un juego y tienes diferentes personaejs en el. y todos pueden correr pero solo algunos pueden saltar ese el el perfecto lugar para los tipos de objetos y algo de herencia. Pero apuesto a que puedes pensar en más formas de hacerlo al igual.