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
-
Ejercicio CU01149E del tutorial JavaScript.
Vaya lio con heredar tanto de otros, ahí va el primer intento:
<!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>
-
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!
-
Gracias César, recordaré cerrar la sentencia de invocación con los ().
Respecto al ejercicio solo he tenido que variar el orden de esto:
hortaliza.prototype.componentePrincipal = '<<Agua>>';
hortaliza.prototype = new plantaCultivada;
Por este orden:
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:
<!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>
-
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!