Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/03/2012, 21:23
Avatar de zerokilled
zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

¡buenas!
no tengo muy claro de lo que exactamente quieres hacer. supongo que te refieres a this de tu clase miClase. hasta donde conozco, hay una forma pero es dependiente de la implementación javascript. resulta que a los eventos, en lugar de un handler (manejador) le puedes pasar un objeto. entonces, si el objeto tiene el método handleEvent, este se utilizará como handler del evento. pero como mencione, depende mucho de la implementación de javascript. por ejemplo, chrome me acepta dicha implementación en los eventos como propiedades (DOM Event 0) pero firefox no:
Código:
document.body.onclick = { // objeto literal;
handleEvent: function(){ // el handler
console.log(this, arguments); 
// en la consola obtienes el objeto literal;
// y los argumentos pasados al handler cuando se invoca;
}}
para que este mismo método funcione en firefox tienes que utilizar addEventListener en lugar de DOM Event 0.
Código:
document.body.addEventListener('click', { // objeto literal como en el ejemplo anterior;
handleEvent: function(){
console.log(this, arguments);
}
}, true);
¿cómo implementas eso utilizando constructores (clases, para algunos)? simplemente creas el método del constructor como regularmente lo harías y luego registras la referencia this como handler.
Código:
function Fn(){
...
this.handleEvent = function(){ ... }; 
this.element.addEventListener('eventType', this, captureMode);
}
desgraciadamente, ninguno de los modelos anteriores funciona en iexplorer (no he comprobado en las versiones 9 y 10), simplemente porque iexplorer utiliza un modelo de eventos distinto al estándar. de existir soluciones alternas, los hay... aunque tengo duda de cual sería la mejor forma. una posibilidad podría ser crear un closure de una referencia a la instancia del constructor. en el handler, en lugar de usar this utilizas la variable.

Código:
function Fn(){
var that = this;
this.handler = function(){
that; // se crea un closure, that hace referencia a la instancia creada
...
};
this.element.eventType = this.handler; 
// no confundir handler con handleEvent;
// lo mismo se puede hacer con addEventListener 
}
otra posibilidad parecida a la anterior es asignarle un nombre al método y luego crear una propiedad (las funciones en javascript son como objetos) con la referencia a la instancia. dentro del handler utilizas el nombre para hacer referencia a la función misma y luego a la propiedad.
Código:
function Fn(){
this.handler = function Handler(){ // en este ejemplo la función "anónima" tiene por nombre "Handler";
Handler.that; // hace referencia a la instancia;
};
this.handler.that = this; // la propiedad a la función;
this.element.eventType = this.handler;
}
para mis gustos, no es tan cómodo como la primera alternativa ya que puedes usar directamente this. seguro hay más opciones, pero estas son de las que puedo pensar por el momento.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 05/09/2012 a las 17:13