Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: bermartinv en 11 de Febrero 2016, 23:45

Título: Herencia en JavaScript jerarquía de clases o cadena de prototipos CU01149E#
Publicado por: bermartinv en 11 de Febrero 2016, 23:45
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>
Título: Re:Herencia en JavaScript jerarquía de clases o cadena de prototipos CU01149E
Publicado por: César Krall en 13 de Febrero 2016, 18:07
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!
Título: Re:Herencia en JavaScript jerarquía de clases o cadena de prototipos CU01149E
Publicado por: bermartinv en 13 de Febrero 2016, 22:31
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>
Título: Re:Herencia en JavaScript jerarquía de clases o cadena de prototipos CU01149E
Publicado por: César Krall en 15 de Febrero 2016, 11:55
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!