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: lekimb en 20 de Mayo 2020, 16:44
-
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.
<!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>
-
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
-
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).
<!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!
-
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