Autor Tema: JavaScript Propiedades y métodos estáticos diferencia con de instancia CU01148E  (Leído 3062 veces)

Rosa

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Buenas noches!

Se plantea el siguiente ejercicio:

Citar
Define un tipo de objeto Meteorito cuyas propiedades de instancia (específicas de cada objeto) sean diametro, temperatura y nombre. La temperatura será un valor numérico que suponemos está en grados centígrados. Como propiedad estática del tipo meteorito define definicionSegunDiccionario (que debe contener la definición de meteorito) y como métodos estáticos obtenerRadio (que debe devolver el radio a partir de un parámetro diametro) y obtenerTemperaturaFarenheit (que debe devolver el valor de temperatura expresado en grados Farenheit a partir de un parámetro temperatura).  Crea un objeto de tipo Meteorito con un diámetro, temperatura y nombre y comprueba que puedes acceder a las propiedades y métodos estáticos mostrando por pantalla la definición de meteorito, la superficie del objeto creado y la temperatura Farenheit del objeto creado.

Y este es mi código:

Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">
<script type="text/javascript">
 
function Meteorito (diametro, temperatura, nombre) {
this.diametro=diametro;
this.temperatura=temperatura;
this.nombre=nombre;
}
 
Meteorito.definicionSegunDiccionario = 'Fragmento de un bólido que cae sobre la Tierra'; //Propiedad estática
Meteorito.obtenerRadio = function () {
this.radio=(this.diametro)/2;
alert('El radio es: '+this.radio);} //Método estático

Meteorito.obtenerTemperatura= function(){
this.temperaturaF=(this.temperatura)*1.8+32;
alert('La temperatura en grados Farenheit es: '+this.temperaturaF);
}

function ejemploObjetos() {
var meteo1 = new Meteorito(100, 14, 'Luna');
alert('La definicón de meteorito es: '+Meteorito.definicionSegunDiccionario);
Meteorito.obtenerRadio();
Meteorito.obtenerTemperatura();
}
</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 </div>
</body>
</html>

Alguien sabe por qué this.temperatura y this.diametro tomar valor NaN en sus métodos?

Espero vuestra respuesta...Mil gracias
« Última modificación: 05 de Septiembre 2015, 13:57 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola Rosa, la clave en este ejercicio está en el concepto de método o propiedad de instancia y método o propiedad estático.

Si pensamos en el tipo de objeto como un molde, las propiedades de instancia son las que son específicas de cada objeto. Por ejemplo si tenemos un molde para fabricar cubos de colores, cada instancia tiene un color distinto.

Sin embargo cuando hablamos de propiedad estática nos referimos a algo que es común a todos las instancias. En este ejemplo si definimos como propiedad estática que el color es rojo, todos los cubos serían rojos, no habría posibilidad de que un cubo fuera azul porque al ser estática es única.

En este ejercicio y releyendo lo que dice la entrega del curso:

Citar
Una propiedad o método estático no se duplica en cada objeto, sino que existe una única vez en memoria.

 De este ejemplo obtenemos la siguiente conclusión:

No se puede acceder a una propiedad o método estático desde una instancia, hay que hacerlo invocando directamente sobre el nombre del objeto que define el tipo (lo que llamaríamos sobre “la clase”).

El resultado será Soy un taxi Renault con carga undefined ¿Por qué? Porque this hace referencia al objeto dentro del cual se encuentra la invocación y en este caso estamos trabajando con un método estático que no conoce las propiedades de un objeto en particular.

Aplicado al código que has planteado tú:

Meteorito.obtenerRadio = function () {
   this.radio=(this.diametro)/2;
   alert('El radio es: '+this.radio);} //Método estático

No es válido porque un método estático no conoce las propiades particulares de un objeto, como sería el diámetro. Por tanto this.diametro no puede ser invocado, y this.radio tampoco tiene sentido en este contexto.

Una respuesta al ejercicio puede ser esta:

Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">
<script type="text/javascript">
 
function Meteorito (diametro, temperatura, nombre) {
this.diametro=diametro;
this.temperatura=temperatura;
this.nombre=nombre;
}
 
Meteorito.definicionSegunDiccionario = 'Fragmento de un bólido que cae sobre la Tierra'; //Propiedad estática
Meteorito.obtenerRadio = function (diametro) {
radio=(diametro)/2;
alert('El radio es: '+radio);} //Método estático

Meteorito.obtenerTemperatura= function(temperatura){
temperaturaF=(temperatura)*1.8+32;
alert('La temperatura en grados Farenheit es: '+temperaturaF);
}

function ejemploObjetos() {
var meteo1 = new Meteorito(100, 14, 'Luna');
alert('La definicón de meteorito es: '+Meteorito.definicionSegunDiccionario);
Meteorito.obtenerRadio(100);
Meteorito.obtenerTemperatura(14);
}
</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 </div>
</body>
</html>


Aunque esto no era lo que pedía el ejercicio, podemos darle un giro para asociar el valor de una propiedad a cada instancia haciendo uso de un método estático como en este código:

Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">
<script type="text/javascript">
 
function Meteorito (diametro, temperaturaGC, nombre) {
this.diametro=diametro;
this.temperaturaGF=Meteorito.obtenerTemperaturaGF(temperaturaGC);
this.nombre=nombre;
}
 
Meteorito.definicionSegunDiccionario = 'Fragmento de un bólido que cae sobre la Tierra'; //Propiedad estática
Meteorito.obtenerRadio = function (diametro) {
radio=(diametro)/2;
alert('El radio es: '+radio);} //Método estático

Meteorito.obtenerTemperaturaGF= function(temperaturaGC){
return (temperaturaGC)*1.8+32;
}

function ejemploObjetos() {
var meteo1 = new Meteorito(100, 14, 'Luna');
alert('La definicón de meteorito es: '+Meteorito.definicionSegunDiccionario);
Meteorito.obtenerRadio(100);
alert('La temperatura en grados Farenheit es la siguiente : '+meteo1.temperaturaGF);
}
</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 </div>
</body>
</html>

Saludos

Rosa

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Muchas gracias, dudas resueltas...

 

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