Autor Tema: Herencia JavaScript prototype función call indica objeto this ejercicio CU01150E  (Leído 3012 veces)

bermartinv

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 298
    • Ver Perfil
Para el primer ejercicio esta es mi solucion:

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<button onclick="mostrarObjeto()">Mostrar Objeto</button>
<script>

    function persona(nombre,nacionalidad){
        this.nombre = nombre || 'Desconociso' ;
        this.nacionalidad = nacionalidad || 'Desconocido';
    }
    persona.prototype.mostrarNacionalidad=function(){
            alert ('La nacionalidad de '+this.nombre+' es '+this.nacionalidad);     
    }
   
    function medico(nombre,nacionalidad,centroDeTrabajo){
            persona.call(this,nombre,nacionalidad);
            this.centroDeTrabajo=centroDeTrabajo || 'Desconocido';
    }
   
    function medicoEspecialista(especialidad,centroDeTrabajo,nacionalidad,nombre){
            medico.call(this,nombre,nacionalidad,centroDeTrabajo);
            this.especialidad=especialidad || 'Desconocida';
    }
   
    medico.prototype=new persona;
    medicoEspecialista.prototype=new medico;
   
    function mostrarObjeto(){
        var primerMedico=new medicoEspecialista('traumatologo','Hospital 9 de Octubre','española','Beltran');
        var msg = ('El medico '+primerMedico.nombre+' con nacionalidad '+primerMedico.nacionalidad+' trabaja en '+primerMedico.centroDeTrabajo+' y tiene la especialidad de ' +primerMedico.especialidad);
        primerMedico.mostrarNacionalidad();
        alert(msg);
       
    }
   
   
    </script>
</body>
</html>


Y para el segundo ejercicio esta:

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<button onclick="crearObjetos()">Mostrar Objetos</button>
<script>
    function Persona(nombre){
        this.nombre = nombre || 'Desconociodo'   
        this.saludar = function (){
            alert ('Soy  '+this.nombre+' profesor '+this.tipo);
        }
    }
    Persona.prototype.definicion="Una persona es una persona";
   
    function Profesor(nombre,institucionAcademica,tipo){
        Persona.call(this,nombre);
        this.institucionAcademica = institucionAcademica || 'Desconocido';
        this.tipo = tipo || 'Desconocido';
    }
   
    function ProfesorInterino(nombre,institucionAcademica,tipo,mesesContratado){
        Profesor.call(this,nombre,institucionAcademica,tipo);
        this.mesesContratado = mesesContratado;
    }
   
    function ProfesorTitular(nombre,institucionAcademica,tipo,anyosTrabajados){
        Profesor.call(this,nombre,institucionAcademica,tipo);
        this.anyosTrabajados=anyosTrabajados;
    }
   
Profesor.prototype=new Persona();
ProfesorInterino.prototype = new Profesor();
ProfesorTitular.prototype = new Profesor();
   
    function crearObjetos(){
        var ProfesorTitular1=new ProfesorTitular('Juan','Universidad de Leon','titular',8);
        var msg1 = ('El profesor '+ProfesorTitular1.tipo+' '+ProfesorTitular1.nombre+' ha trabajado durante '+ProfesorTitular1.anyosTrabajados+' anyos en '+ProfesorTitular1.institucionAcademica);
        var ProfesorInterino1=new ProfesorInterino('Pedro','Universidad Politecnica de Valencia','interino',5);
        var msg2 = ('El profesor '+ProfesorInterino1.tipo+' '+ProfesorInterino1.nombre+' ha trabajado durante '+ProfesorInterino1.mesesContratado+' meses en '+ProfesorInterino1.institucionAcademica);
        alert(msg1);
        alert(msg2);
        ProfesorTitular1.saludar();
        ProfesorInterino1.saludar();
    }
</script>
</body>
</html>
« Última modificación: 14 de Noviembre 2015, 16:56 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
Hola bermartinv!

Para el primer ejercicio indicarte que aunque no genera un error veo preferible seguir siempre la norma de incluir paréntesis vacíos cuando se invoca new, por ejemplo medico.prototype=new persona(); en lugar de medico.prototype=new persona;

Para el segundo ejercicio veo algunas cosas que habría que mejorar:

a) En el código de Persona incluyes la función saludar y en la función saludar invocas this.tipo

Si hago esto:

      var persona1 = new Persona('Antonio');
      persona1.saludar();


Obtengo esto:

Soy  Antonio profesor undefined


Este resultado no es correcto, ¿por qué ocurre? Porque no has respetado el esquema de herencia. Una persona no puede saber si va a ser creada directamente o si simplemente va a facilitar sus métodos y atributos en la cadena de herencia. Por tanto no debe usar atributos que no le corresponden.

b) Otra cosa que no veo correcto es el uso del atributo tipo ¿Está eso en el esquema de herencia que plantea el ejercicio? Además como parámetro no parece necesario. Si se crea un profesor titular, este atributo podrías establecerlo sin necesidad de recibirlo como parámetro, por el simple hecho de que el objeto es profesor titular, sin necesidad de recibirlo como argumento.

Entiendo que lo has hecho para hacer el saludo más completo, pero si lo planteas de esa manera tendrías que eliminar la referencia a atributos inferiores en el esquema de herencia, o hacer una comprobación de tipos antes de usar esos atributos.

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

bermartinv

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 298
    • Ver Perfil
Hola César, para el apartado a , es verdad que en la creación de la herencia del objeto se me ha olvidado añadir los parentesis.

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<button onclick="mostrarObjeto()">Mostrar Objeto</button>
<script>

    function persona(nombre,nacionalidad){
        this.nombre = nombre || 'Desconociso' ;
        this.nacionalidad = nacionalidad || 'Desconocido';
    }
    persona.prototype.mostrarNacionalidad=function(){
            alert ('La nacionalidad de '+this.nombre+' es '+this.nacionalidad);     
    }
   
    function medico(nombre,nacionalidad,centroDeTrabajo){
            persona.call(this,nombre,nacionalidad);
            this.centroDeTrabajo=centroDeTrabajo || 'Desconocido';
    }
   
    function medicoEspecialista(especialidad,centroDeTrabajo,nacionalidad,nombre){
            medico.call(this,nombre,nacionalidad,centroDeTrabajo);
            this.especialidad=especialidad || 'Desconocida';
    }
   
    medico.prototype=new persona();
    medicoEspecialista.prototype=new medico();
   
    function mostrarObjeto(){
        var primerMedico=new medicoEspecialista('traumatologo','Hospital 9 de Octubre','española','Beltran');
        var msg = ('El medico '+primerMedico.nombre+' con nacionalidad '+primerMedico.nacionalidad+' trabaja en '+primerMedico.centroDeTrabajo+' y tiene la especialidad de ' +primerMedico.especialidad);
        primerMedico.mostrarNacionalidad();
        alert(msg);
       
    }
    </script>
</body>
</html>


Para el segundo apartado, entiendo lo que me dices en los dos casos. No puedo usar 'tipo' cuando Persona no tiene por encima de él definido esta propiedad.
Para lo que me comentas de la propiedad 'tipo' que no se reciba como parametro, la verdad que tienes mucha razón, ya que es una característica que tienen común todos los profesores interinos y los profesores titulares. Lo he estado pensado y lo he definido como una propiedad estática de estos objetos.

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<button onclick="crearObjetos()">Mostrar Objetos</button>
<script>
    function Persona(nombre){
        this.nombre = nombre || 'Desconociodo'   
        this.saludar = function (){
            alert ('Soy  '+this.nombre+' profesor ');
        }
    }
    Persona.prototype.definicion="Una persona es una persona";
   
    function Profesor(nombre,institucionAcademica){
        Persona.call(this,nombre);
        this.institucionAcademica = institucionAcademica || 'Desconocido';
       
    }
   
    function ProfesorInterino(nombre,institucionAcademica,mesesContratado){
        Profesor.call(this,nombre,institucionAcademica);
        this.mesesContratado = mesesContratado;
    }
    ProfesorInterino.tipoContrato="temporal";
   
    function ProfesorTitular(nombre,institucionAcademica,anyosTrabajados){
        Profesor.call(this,nombre,institucionAcademica);
        this.anyosTrabajados=anyosTrabajados;
    }
    ProfesorTitular.tipoContrato="indefinido";
   
Profesor.prototype=new Persona();
ProfesorInterino.prototype = new Profesor();
ProfesorTitular.prototype = new Profesor();
   
    function crearObjetos(){
        var ProfesorTitular1=new ProfesorTitular('Juan','Universidad de Leon',8);
        var msg1 = ('El profesor '+ProfesorTitular1.nombre+' ha trabajado durante '+ProfesorTitular1.anyosTrabajados+' anyos en '+ProfesorTitular1.institucionAcademica+' y tienen un contrato '+ProfesorTitular.tipoContrato);
        var ProfesorInterino1=new ProfesorInterino('Pedro','Universidad Politecnica de Valencia',5);
        var msg2 = ('El profesor '+ProfesorInterino1.nombre+' ha trabajado durante '+ProfesorInterino1.mesesContratado+' meses en '+ProfesorInterino1.institucionAcademica+' y tienen un contrato '+ProfesorInterino.tipoContrato);
        alert(msg1);
        alert(msg2);
        ProfesorTitular1.saludar();
        ProfesorInterino1.saludar();
    }
</script>
</body>
</html>
« Última modificación: 18 de Noviembre 2015, 09:03 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
Hola!

Ahora lo veo bien! Para quienes revisen el ejercicio tener en cuenta que el atributo tipoContrato no se pedía en el ejercicio, es "un añadido"

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