Autor Tema: Herencia prototipos JavaScript crear objetos prototype propiedades item CU01149E  (Leído 1585 veces)

lekimb

  • Sin experiencia
  • *
  • Mensajes: 3
    • Ver Perfil
Hola, estoy intentado resolver el ejercicio CU01149E del curso de JavaScript y la verdad es que no entiendo porqué el código no se ejecuta como debiera.

Tal y como yo he entendido el ejercicio, los objetos zanahoria, lechuga y tomate tienen como prototipo al objeto hortaliza (un prototipo hortaliza para zanahoria, otro para lechuga, y otro para tomate). A su vez, el objeto hortaliza tiene como prototipo al objeto planta cultivada; por último, planta cultivada tiene como prototipo al objeto vegetal.

El caso es que cuando intento acceder a las propiedades definidas para los objetos primarios y sus prototipos, sólo obtengo los resultados esperados para 'tomate' y para 'hortaliza', que es su prototipo directo. Si intento acceder a las propiedades 'nombreCientifico' o 'movilidad, definidas para 'plantaCultivada' y 'vegetal' respetivamente el valor que me devuelve es undefined. No sé porqué ocurre esto.

Si alguien pudiera echarme una mano se lo agradecería. Un saludo.

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function zanahoria() {
this.valorCalórico = '45 cal';
this.tipoDeHortaliza = undefined;
}

function lechuga() {
this.valorCalórico = '31 cal';
this.tipoDeHortaliza = undefined;
}

function tomate() {
this.valorCalórico = '39 cal';
this.tipoDeHortaliza = undefined;
}

function hortaliza() {
this.componentePrincipal = 'agua';
}

zanahoria.prototype = new hortaliza();
lechuga.prototype = new hortaliza();
tomate.prototype = new hortaliza();

function plantaCultivada() {
this.nombreCientifico = 'desconocido';
}

hortaliza.prototype = new plantaCultivada();

function vegetal() {
this.movilidad = 'ser vivo sin movilidad';
}

plantaCultivada.prototype = new vegetal();

function empezar() {
var tomate1 = new tomate();
tomate1.tipoDeHortaliza = 'tomatillo';
tomate1.nombreCientifico = 'tomatus totalus';
alert(tomate1.tipoDeHortaliza);
alert(tomate1.valorCalórico);
alert(tomate1.componentePrincipal);
alert(tomate1.nombreCientífico); //undefined
alert(tomate1.movilidad); //undefined
}


</script>
</head>
<body>
<p onclick="empezar()">Empezar</p>
</body>
</html>
« Última modificación: 04 de Octubre 2020, 13:47 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:CU01149E Dudas herencia prototipos JavaScript
« Respuesta #1 en: 20 de Mayo 2020, 17:52 »
Buenas lekimb, léete https://aprenderaprogramar.com/foros/index.php?topic=1460.0 donde hay indicaciones útiles para escribir en los foros. Creo que hay varios problemas en tu código, entre otros el orden en que defines las cosas y que las propiedades de prototipo sólo debes definirlas en el prototipo, no en el objeto. En el hilo https://aprenderaprogramar.com/foros/index.php?topic=3941.0 hay una solución, revísala y si no te queda claro consulta. Salu2

lekimb

  • Sin experiencia
  • *
  • Mensajes: 3
    • Ver Perfil
Re:CU01149E Dudas herencia prototipos JavaScript
« Respuesta #2 en: 20 de Mayo 2020, 18:36 »
Hola Ogramar,

Gracias por responderme tan rápido. Me he mirado las indicaciones para publicar en los foros y veo que el título del hilo no cumple con las normas por empezar con la referencia a un ejercicio. Si hay alguna otra cosa que te chirría, te agradezco que me la digas.

He hecho algunos cambios en el código y ahora sí devuelve los resultados esperados. Concretamente he invertido el orden de asignación de prototipos, comenzando primero por el más general (vegetal) y construyendo hacia 'abajo' la simulación de herencia. No sé si esta es la única forma posible de definir prototipos o si también podría hacerse hacia 'arriba'; es decir, creando supertipos y asignándolos como prototipos (en vez de creando subtipos y asignándolos como prototipos).

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">

function vegetal() {
this.movilidad = 'ser vivo sin movilidad';
}

function plantaCultivada() {
this.nombreCientifico = 'desconocido';
}

plantaCultivada.prototype = new vegetal();

function hortaliza() {
this.componentePrincipal = 'agua';
this.tipoDeHortaliza = undefined;
}

hortaliza.prototype = new plantaCultivada();

function zanahoria() {
this.valorCalórico = '45 cal';
}

function lechuga() {
this.valorCalórico = '31 cal';
}

function tomate() {
this.valorCalórico = '39 cal';
}

zanahoria.prototype = new hortaliza();
lechuga.prototype = new hortaliza();
tomate.prototype = new hortaliza();

function empezar() {
var tomate1 = new tomate();
tomate1.tipoDeHortaliza = 'tomatillo';
tomate1.nombreCientifico = 'tomatus totalus';
alert(tomate1.tipoDeHortaliza);
alert(tomate1.valorCalórico);
alert(tomate1.componentePrincipal);
alert(tomate1.nombreCientifico);
alert(tomate1.movilidad);
}


</script>
</head>
<body>
<p onclick="empezar()">Empezar</p>
</body>
</html>

Gracias de nuevo!

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:Dudas herencia prototipos JavaScript CU01149E
« Respuesta #3 en: 20 de Mayo 2020, 20:43 »
Buenas, un título adecuado podría haber sido <<Herencia prototipos JavaScript crear objetos prototype CU01149E>>. En general conviene incluir palabras clave para facilitar la localización y omitir cosas como "ayuda", "dudas", etc. Los moderadores vamos revisando y modificando títulos si los vemos inadecuados.

Esto de los prototipos es un tanto lioso, así que igual me equivoco en algo. Como yo lo veo, al indicar plantaCultivada.prototype = new vegetal(); estás haciendo que vegetal sea el supertipo de plantaCultivada. O dicho de otra manera, plantaCultivada es un subtipo de vegetal. Para crear un subtipo necesitas haber definido el supertipo primero. Si no, ¿cómo indicas que es un subtipo si no existe supertipo?

Pongamos por ejemplo Militar como supertipo y Soldado y Teniente como subtipos. Lo normal es definir el supertipo y luego defines los subtipos haciendo referencia a que heredan del supertipo.

En JavaScript prototype haría alusión a supertipo.

No sé si me he liado. Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".