Foros del Web » Programando para Internet » Javascript »

Objetos, Eventos y ... problemas

Estas en el tema de Objetos, Eventos y ... problemas en el foro de Javascript en Foros del Web. Buenas caballeros! he estado toda la noche intentando solventar el siguiente problema, tengo dos objetos, de un mismo prototipo, este prototipo tiene un método que ...
  #1 (permalink)  
Antiguo 23/05/2013, 01:13
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Pregunta Objetos, Eventos y ... problemas

Buenas caballeros!


he estado toda la noche intentando solventar el siguiente problema, tengo dos objetos, de un mismo prototipo, este prototipo tiene un método que añade un evento.


Los objetos no presentan ningún error, ni tampoco sus propiedades ni métodos, El problema viene cuando el evento es lanzado, Este solo actúa sobre el ultimo objeto que ha añadido el evento.

Pongo un ejemplo explicito :


Código Javascript:
Ver original
  1. /* Funcion Simple que recibe por argumentos, la referencia del Objeto al que se le va a modificar la edad : edad actual +1*/
  2.  
  3. ModificadorEdad(objeto){
  4.  
  5.    Objeto = objeto;
  6.    Objeto.Age = (Objeto.Age+1);
  7.  
  8. }
  9.  
  10.  
  11. /*Prototipo Persona, tiene dos propiedades, edad (sera modificada por la funcion de arriba y Objeto, que va a guardar la referencia del objeto instanciado*/
  12.  
  13. function Persona(age){
  14.  
  15.         this.Age = age;
  16.         this.Objeto;
  17.  
  18.        //Un metodo que recibe un argumento, este sera la referencia del objeto
  19.  
  20.         this.PutNameObject = function(Objeto){
  21.             this.Objeto = Objeto;
  22.         }
  23.  
  24.        /*Segundo metodo, que añadirá un evento al body, este llamara a la funcion simple de arriva que modifica la edad del objeto que se le pase por argumento*/
  25.  
  26.     this.ChargeEvent = function(){
  27.        
  28.         objeto = this.Objeto;
  29.         document.body.addEventListener("keypress", function () {ModificadorEdad(objeto);}, false); 
  30.     }
  31.  
  32. }
  33.  
  34. /*Instanciamos dos Objetos Persona : titos y pedro, cada uno lleva a cavo los dos metodos del prototipo*/
  35.  
  36. var titos = new Persona(30);
  37. titos.PutNameObject(titos);
  38. titos.ChargeEvent();
  39.  
  40. var pedro = new Persona(40);
  41. Pedro.PutNameObject(Pedro);
  42. Pedro.ChargeEvent();


Bien, como he dicho, los objetos no dan problemas, si llevamos a cavo este codigo simplificado en cosola, para titos y para pedro tendremos las propiedades bien inicializadas, su edad y la referencia de su objeto mismo, asi como si inspeccionamos el elemento body, veremos que se añadieron satisfactoriamente los dos eventos listener keypess.

El problema viene cuando lanzamos el evento, volvemos a consola, revisamos la propieadad edad y vemos que solo se ha modificado la del segundo objeto, en este caso para el objeto pedro ¿por que?
  #2 (permalink)  
Antiguo 23/05/2013, 16:07
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Objetos, Eventos y ... problemas

Buenas,

Tienes algunas cosas un poco raras, como guardar la referencia al objeto dentro del objeto (!!!), pero el problema principal es que estabas creando una variable global.

En concreto:

this.ChargeEvent = function(){

objeto = this.Objeto;
document.body.addEventListener("keypress", function () {ModificadorEdad(objeto);}, false);
}

Esa variable se crea globalmente y se sobreescribe con el último objeto que la sobrescribe. Para evitar esto, debes poner var para crearla de manera local a la función.

Otra cosa es que tengas en cuenta que Javascript es sensible a mayúsculas y minúsculas.

Te dejo como lo haría yo quitando cosas redundantes:

Código Javascript:
Ver original
  1. /* Funcion Simple que recibe por argumentos, la referencia del Objeto al que se le va a modificar la edad : edad actual +1*/
  2.  
  3. function ModificadorEdad(objeto)
  4. {
  5.     objeto.Age++;
  6.     alert(objeto.Age);
  7. }
  8.  
  9. /*Prototipo Persona, tiene dos propiedades, edad (sera modificada por la funcion de arriba y Objeto, que va a guardar la referencia del objeto instanciado*/
  10.  
  11. function Persona(age)
  12. {
  13.     this.Age = age;
  14.    
  15.     /*Segundo metodo, que añadirá un evento al body, este llamara a la funcion simple de arriva que modifica la edad del objeto que se le pase por argumento*/
  16.      
  17.     this.ChargeEvent = function()
  18.     {
  19.         var thisp = this;
  20.         document.body.addEventListener("keypress", function ()
  21.                                        {
  22.                                            ModificadorEdad(thisp);
  23.                                        }, false);        
  24.     }
  25. }
  26.  
  27. /*Instanciamos dos Objetos Persona : titos y pedro, cada uno lleva a cavo los dos metodos del prototipo*/
  28.  
  29. var titos = new Persona(30);
  30. titos.ChargeEvent();
  31.  
  32. var pedro = new Persona(40);
  33. pedro.ChargeEvent();

Un saludo.
  #3 (permalink)  
Antiguo 23/05/2013, 16:17
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Objetos, Eventos y ... problemas

Gracias! , no había caído en el tema de las globales, por cierto, guardar la referencia del objeto dentro del propio objeto, sonara raro, pero si vamos a consola, ponemos por ejemplo titos.Objeto; , nos devolverá el objeto sin errores, idem para pedro, si alguien tiene una mejor forma de guardar una "auto" referencia del objeto , que lo exponga aquí por favor!
  #4 (permalink)  
Antiguo 23/05/2013, 16:23
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Objetos, Eventos y ... problemas

¿Para que quieres guardar una "autoreferencia" si ya tienes el objeto? No le veo la utilidad la verdad, a no ser que vayas a crear listas enlazadas (pero ese es otro caso).
  #5 (permalink)  
Antiguo 23/05/2013, 16:37
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Objetos, Eventos y ... problemas

por que si hago algo parecido a :


Código Javascript:
Ver original
  1. function Persona(){
  2.  
  3. this.Objeto = this;
  4.  
  5. }

Se referencia al prototipo, no al objeto, ademas, ¿soy el unico al que le resulta tremendamente util guardar una autoreferencia dentrod el objeto? entre otras cosas lleva a automatizar muchas funciones que retornen al propio item. La encapsulacion trata de que cuando integras un conjunto de funciones para trabajar entre si, ninguna de ellas se tenga que preocupar de preguntar nada.
  #6 (permalink)  
Antiguo 23/05/2013, 16:43
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Objetos, Eventos y ... problemas

Ya sólo por curiosidad, ¿me puedes poner algún ejemplo en el que sea útil hacer eso?

Es interesante ver los distintos puntos de vista y siempre se puede aprender algo.
  #7 (permalink)  
Antiguo 23/05/2013, 17:13
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Objetos, Eventos y ... problemas

Si tienes un metodo de otra clase que va hacer un calculo automatico de x propieadedes de multiples objetos por ejemplo y luego tiene que devolver el resultado al la propieadad especifica de un objeto concreto, habiendo multitud de ellos del mismo prototipo, no se, te pongo esto como ejemplo por que es lo que estoy haciendo.

Etiquetas: eventos, objetos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:12.