Autor Tema: JavaScript clases objetos y métodos con referencia a funciones externas CU01144E  (Leído 3783 veces)

bermartinv

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 298
    • Ver Perfil
Respuesta para el ejercicio CU01144E del curso de JavaScript:

Citar
Define un tipo de objeto Medico en JavaScript que tenga como propiedades: nombre (String), personasCuradas (número entero), especialidad (String) y como métodos un método denominado curarPersona y otro método denominado mostrarDatos. El método curarPersona deberá añadir una unidad al valor de la propiedad personasCuradas y el método mostrarDatos deberá mostrar los datos el médico. Por ejemplo, “El médico se llama Juan Eslava, su especialidad es traumatología y lleva curadas 8 personas”. Crea dos objetos del tipo definido, e invoca sus métodos para comprobar que funcionan correctamente.

Crea las dos alternativas de código: métodos con funciones internas anónimas o métodos con referencia a funciones externas.


Adjunto código para funciones anónimas

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<script>   
    function crearMedico(nombre,curados,especialidad){
     this.nombre = nombre;
     this.curados = curados;
     this.especialidad = especialidad;
     this.curarPersona=function (){
            curados--; 
     }
     this.mostrarDatos=function(){
         var msg = "El nombre del medico "+this.nombre+" lleva "+this.curados+" curados y su especialidad es "+this.especialidad;
         alert (msg);
     }
    }
   
function crearObjeto(){
    var medico1 = new crearMedico("Pep",3,"urologo");
    var medico2=new crearMedico("Paco",5,"traumatólogo");
    medico1.mostrarDatos();
    medico2.mostrarDatos();
    }
     
     
     
</script>
<body>
    <input type="button" value="Añadir medico" onclick="crearObjeto()"/>
</body>
</html>


Y para funciones externas

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<script>   
    function crearMedico(nombre,curados,especialidad){
     this.nombre = nombre;
     this.curados = curados;
     this.especialidad = especialidad;
     this.curarPersona=disminuir;
     this.mostrarDatos=muestrear;
    }
   
function disminuir(){
            this.curados--; 
     }
function muestrear(){
         var msg = "El nombre del medico "+this.nombre+" lleva "+this.curados+" curados y su especialidad es "+this.especialidad;
         alert (msg);
     }
   
   
function crearObjeto(){
    var medico1 = new crearMedico("Pep",3,"urologo");
    var medico2=new crearMedico("Paco",5,"traumatólogo");
    medico1.mostrarDatos();
    medico2.mostrarDatos();
    }
     
     
     
</script>
<body>
    <input type="button" value="Añadir medico" onclick="crearObjeto()"/>
</body>
</html>
« Última modificación: 12 de Febrero 2016, 08:38 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Buenas bermartinv

En este ejercicio se intenta trabajar con objetos JavaScript. A la hora de nombrar una función definidora de objeto debes ponerle un nombre que refleje lo que va a ser un objeto creado con dicha función, por ejemplo en este caso sería function Medico porque lo que se va a crear con esa función son objetos de tipo Medico

De este modo después de esta línea podrás decir:

var medico1 = new crearMedico("Pep",3,"urologo");

He creado un objeto Medico denominado medico1

En lugar de "he creado un objeto crearMedico denominado medico1"

Tienes que mejorar varias cosas:

El ejercicio pedía "Crea dos objetos del tipo definido, e invoca sus métodos para comprobar que funcionan correctamente." No has invocado sus métodos, con lo cual no se comprueba que funcionen correctamente.

De hecho tienes este código:      this.curarPersona=function (){curados--; } ¿En lugar de ir curando cada vez más personas el médico va curando cada vez menos? Es al revés, cada vez que invocas el método debe incrementarse en una unidad el número de personas curadas.

Revisa el código y para probarlo en el propio código crea varios médicos, invoca los métodos sobre los objetos y después de invocar los métodos muestra los datos, de ese modo puedes comprobar si después de ejecutar el método ha habido cambios en el objeto o no y si los cambios son los deseados. Por ejemplo después de invocar el método curarPersona si pides los datos del médico deberá mostrarte que ha curado una persona más de lo que llevaba anteriormente.

Salu2

bermartinv

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 298
    • Ver Perfil
Gracias por corregit mis fallos y entiendo lo que me dices.
Para funciones anónimas ( me faltaba especificar en el metodo curarPersona especificar que cada aumento era en cada variable de cada objeto):
Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<script>   
    function Medico(nombre,curados,especialidad){
     this.nombre = nombre;
     this.curados = curados;
     this.especialidad = especialidad;
     this.curarPersona=function (){
            this.curados++; 
     }
     this.mostrarDatos=function(){
         var msg = "El nombre del medico "+this.nombre+" lleva "+this.curados+" curados y su especialidad es "+this.especialidad;
         alert (msg);
     }
    }
   
function crearObjeto(){
    var medico1 = new Medico("Pep",3,"urologo");
    var medico2=new Medico("Paco",5,"traumatólogo");
    medico1.curarPersona();
    medico1.curarPersona();
    medico1.curarPersona();
    medico2.curarPersona();
    medico1.mostrarDatos();
    medico2.mostrarDatos();
    }
     
     
     
</script>
<body>
    <input type="button" value="Añadir medico" onclick="crearObjeto()"/>
</body>
</html>

Para funciones externas:

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<script>   
    function Medico(nombre,curados,especialidad){
     this.nombre = nombre;
     this.curados = curados;
     this.especialidad = especialidad;
     this.curarPersona=disminuir;
     this.mostrarDatos=muestrear;
    }
   
function disminuir(){
            this.curados++; 
     }
function muestrear(){
         var msg = "El nombre del medico "+this.nombre+" lleva "+this.curados+" curados y su especialidad es "+this.especialidad;
         alert (msg);
     }
   
   
function crearObjeto(){
    var medico1 = new Medico("Pep",3,"urologo");
    var medico2=new Medico("Paco",5,"traumatólogo");
    medico1.curarPersona();
    medico1.curarPersona();
    medico1.curarPersona();
    medico2.curarPersona();
    medico1.mostrarDatos();
    medico2.mostrarDatos();
    }
     
     
     
</script>
<body>
    <input type="button" value="Añadir medico" onclick="crearObjeto()"/>
</body>
</html>

Y lo dicho, muchas gracias.

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas, bermartinv.

Veo el código bien y las observaciones por parte de Ogramar.

Sólo una cosita que se te ha escapado en el segundo código que has puesto. Creo que en el ejemplo de las funciones externas querías poner function aumentar y no disminuir, porque realmente, después de la corrección por tu parte, lo que haces es aumentar las personas curadas. Pero ya te digo, supongo que es por no darte cuenta.

Para ver que el método "curarPersonas" funciona correctamente, yo invoqué primero el método "mostrarDatos" luego "curarPersonas" y después otra vez "mostrarDatos". De dicha forma realmente se observa que la cantidad de las personas curada sube (sin que tengas que mirar el código "por dentro").

Mira, mi código ha quedado de la siguiente forma:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">

function medico(){
this.nombre='Juan Eslava';
this.personasCuradas=8;
this.especialidad='traumatología';
this.curarPersonas=function(){
this.personasCuradas=this.personasCuradas+1;
}
this.mostrarDatos=function(){
var msg='El médico se llama: '+this.nombre+', su especialidad es: '+this.especialidad+' y lleva curadas: '+this.personasCuradas;
alert(msg);
}
}


function ejemploObjetos(){
var datosMedico= new medico();
var datosMedico2=new medico();//no se ve la diferencia, porque las propiedades en la función medico(); tienen el mismo valor, pero vemos que el código funciona.
datosMedico.mostrarDatos();
datosMedico.curarPersonas();
datosMedico.mostrarDatos();
datosMedico.curarPersonas();
datosMedico.mostrarDatos();
datosMedico2.mostrarDatos();
datosMedico2.curarPersonas();
datosMedico2.mostrarDatos();
datosMedico2.curarPersonas();
datosMedico2.mostrarDatos();
}
</script>
</head>
<body>
<div id="cabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplos JavaScript</h3>
</div>
<div style="color: blue;" id="pulsador" onclick="ejemploObjetos()">Probar ejercicio</div>
</body>
</html>

También tengo que decir que no tiene mucho sentido crear dos objetos definidos con los mismos valores, pero como en el ejercicio ponía que siempre se tenía que mostrar que el médico se llama: Juan Eslava y es traumatólog, decidí que no tendía que pasar los valores como parámetros de una función a la otra, pero debo admitir que como lo has hecho tu, se ve que son dos médicos distintos.

Saludos.

bermartinv

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 298
    • Ver Perfil
Tienes razón dimiste, se me pasó.
Respecto a tu código tengo que decirte el algo. La función medico, por decirlo de una manera es el constructor de los objetos, ahí definiremos las características de cada objeto y cuando llamemos a esta función le daremos todas las variables del objeto. No se inicializa los valores con un objeto específico como has hecho. Como puedes ver has creado los datos de un medico pero para crear otro médico que harias?
Lo suyo es crear un objeto como definición.
Código: [Seleccionar]
function constructor(variable1,variable2,variable3){
  this.nombre = variable1;
  this.ciudad = variable2;
  this.edad = variable3;
}
function crearObjeto(){
persona1 = new constructor("Paco","Madrid",32);
persona2 = new constructor("Pep","Valencia",34);
persona3 = new constructor("Maria","Barcelona",45);
}
}
De esta forma hemos construido un constructor de objetos

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Sí, sí. Es así. Te comenté que no veía mucho sentido que siempre apareciera el nombre del mismo médico, pero había entendido así el ejercicio.

Saludos.

 

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