2011-10-20 18 views
5

tengo un problema, quiero crear una clase de JavaScript:clases en JavaScript utilizando prototipo

function Calculatore(txt,elements) { 
    this.p= new Processor(); 
    this.output=txt; 
    $(elements).click(this.clickHandler); 

} 
Calculatore.prototype.clickHandler = function() { 
var element=$(this); 

// Code Here 

// "this" contains the element. 
// But what if I want to get the "output" var? 
// I tried with Calculatore.prototype.output but no luck. 

} 

Entonces, ¿cómo puedo solucionar esto?

Respuesta

3

Tiene una colisión entre this valores. Actualmente no tiene acceso a la instancia porque this se ha establecido en el elemento dentro de un controlador de clic.

se puede hacer una función de proxy para pasar tanto el valor this (elemento) y la instancia:

function Calculatore(txt,elements) { 
    this.p= new Processor(); 
    this.output=txt; 
    var inst = this; // copy instance, available as 'this' here 

    $(elements).click(function(e) { 
     return inst.clickHandler.call(this, e, inst); // call clickHandler with 
                 // 'this' value and 'e' 
                 // passed, and send 'inst' 
                 // (the instance) as well. 
                 // Also return the return 
                 // value 
    }); 

} 

Calculatore.prototype.clickHandler = function(e, inst) { 
    var element = $(this); 

    var output = inst.output; 
}; 
+0

oh, me salvaste el pelo, gracias! – elios264

3

Usted puede utilizar $.proxy de jQuery:

function Calculatore(txt,elements) { 
    this.p= new Processor(); 
    this.output=txt; 
    $(elements).click($.proxy(this.clickHandler, this)); 
} 

Calculatore.prototype.clickHandler = function(event) { 
    var clickedElement = event.target; 
    alert(this.output); 
} 

Editado. Jason sacó un buen punto en los comentarios. Probablemente sea mejor usar event.target, que hace referencia solo al elemento al que se ha hecho clic, en lugar de elements, que puede hacer referencia a una matriz de objetos que coincidan con la selección.

+1

o use 'event.target' en lugar de guardar los elementos (event es el primer parámetro en clickHandler) –

+0

@Jason, sí, buena llamada. – hyperslug

+0

Tenga en cuenta que event.target (que es la especificación W3C) no es compatible con IE. También deberá verificar event.srcElement. –

Cuestiones relacionadas