Autor Tema: Herencia en JavaScript jerarquía de clases o cadena de prototipos CU01149E#  (Leído 3155 veces)

bermartinv

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 298
    • Ver Perfil
Ejercicio CU01149E del tutorial JavaScript.

Vaya lio con heredar tanto de otros, ahí va el primer intento:

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<script>
    function vegetal(){
        this.nombre = '';   
    }
    vegetal.prototype.movilidad = '<<Ser vivo sin movilidad>>';
   
    function plantaCultivada(){
        this.nombreCientifico = 'desconocido';
    }
    plantaCultivada.prototype = new vegetal;       
   
    function hortaliza(){
        this.tipoHortaliza = 'indefinido';   
    }
   
    hortaliza.prototype.componentePrincipal = '<<Agua>>';
    hortaliza.prototype = new plantaCultivada;
   
    function Zanahoria(){
        this.podCalorias = 45;   
    }
    Zanahoria.prototype = new hortaliza;
   
    function Lechuga(){
        this.podCalorias = 31;   
    }
    Lechuga.prototype = new hortaliza;
   
    function Tomate(){
        this.podCalorias = 39;   
    }
    Tomate.prototype = new hortaliza;
   
   
   
    function plantas(){
        tomate1 = new Tomate;
        tomate1.nombre  = 'tomatito';
        tomate1.nombreCientifico = 'tomate rojito';
        tomate1.tipoHortaliza = 'tomatus';
        msg = 'El nombre del tomate1 es '+tomate1.nombre;
        msg = msg + ' que corresponde a ' +tomate1.movilidad;
        msg = msg + ' con nombre cientifico '+tomate1.nombreCientifico;
        msg = msg + ' y es del tipo de hortaliza '+tomate1.tipoHortaliza;
        msg = msg + 'cuyo componente principal es el '+tomate1.componentePrincipal;
        alert (msg);
    }
</script>
<body>
    <input type="button" value="Plantas" onclick="plantas()" />
</body>
</html>
« Última modificación: 24 de Junio 2017, 16:41 por Ogramar »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola!

Al ejecutar el ejercicio sale un undefined en

El nombre del tomate1 es tomatito que corresponde a <<Ser vivo sin movilidad>> con nombre cientifico tomate rojito y es del tipo de hortaliza tomatuscuyo componente principal es el undefined

El undefined parece indicar que hay algo que no está funcionando bien en la cadena de herencia, si estuviera funcionando bien debería saler Agua

También comentarte que has usado la invocación Tomate.prototype = new hortaliza; donde no aplicas paréntesis para el new, nosotros recomendamos usar siempre

Tomate.prototype = new hortaliza();

incluyendo paréntesis

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

bermartinv

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 298
    • Ver Perfil
Gracias César, recordaré cerrar la sentencia de invocación con los ().

Respecto al ejercicio solo he tenido que variar el orden de esto:

Código: [Seleccionar]
    hortaliza.prototype.componentePrincipal = '<<Agua>>';
    hortaliza.prototype = new plantaCultivada;

Por este orden:

Código: [Seleccionar]
hortaliza.prototype = new plantaCultivada();
hortaliza.prototype.componentePrincipal = '<<Agua>>';

Llego a la conclusión que primero se tendrá que crear la invocación a los otros objetos.

Queda así el código:

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<script>
    function vegetal(){
        this.nombre = '';   
    }
    vegetal.prototype.movilidad = '<<Ser vivo sin movilidad>>';
   
    function plantaCultivada(){
        this.nombreCientifico = 'desconocido';
    }
    plantaCultivada.prototype = new vegetal();       
   
    function hortaliza(){
        this.tipoHortaliza = 'indefinido';   
    }
   
    hortaliza.prototype = new plantaCultivada();
    hortaliza.prototype.componentePrincipal = '<<Agua>>';
   
   
    function Zanahoria(){
        this.podCalorias = 45;   
    }
    Zanahoria.prototype = new hortaliza();
   
    function Lechuga(){
        this.podCalorias = 31;   
    }
    Lechuga.prototype = new hortaliza();
   
    function Tomate(){
        this.podCalorias = 39;   
    }
    Tomate.prototype = new hortaliza();
   
   
   
    function plantas(){
        tomate1 = new Tomate;
        tomate1.nombre  = 'tomatito';
        tomate1.nombreCientifico = 'tomate rojito';
        tomate1.tipoHortaliza = 'tomatus';
        msg = 'El nombre del tomate1 es '+tomate1.nombre;
        msg = msg + ' que corresponde a ' +tomate1.movilidad;
        msg = msg + ' con nombre cientifico '+tomate1.nombreCientifico;
        msg = msg + ' y es del tipo de hortaliza '+tomate1.tipoHortaliza;
        msg = msg + ' cuyo componente principal es el '+tomate1.componentePrincipal;
        alert (msg);
    }
</script>
<body>
    <input type="button" value="Plantas" onclick="plantas()" />
</body>
</html>
« Última modificación: 15 de Febrero 2016, 11:52 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Ahora ok, coincido que para asignar una propiedad vinculada al prototype primero tienes que definir la existencia del prototype con new y luego definir las propiedades. Si no lo haces en este orden las propiedades que se hubieran definido antes del new quedan anuladas (undefined) al utilizar el new.

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

 

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