Quisiera plantearos un problema que me ha salido y no se como se puede solucionar (seguro que se puede).
Veréis, estoy intentando hacer un paquete que contenga un conjunto de clases, lo hago de la siguiente forma:
Código:
con esto tengo el paquete, para añadir una clase hago:var MyPackage = new Object();
Código:
Esto lo tengo en un fichero llamado pack.js.MyPackage.ClassOne = function(){ var a = false; } MyPackage.ClassOne.prototype = { Init: function(){ this.a = 1; document.getElementById("some").addEventListener("click",this.Func2,false); }, Func1: function(){ alert(this.a); }, Func2: function(){ this.Func1(); } }
En el fichero HTML tengo lo siguiente:
Código:
Al hacer click sobre el texto aqui me aparece el siguiente error:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <title>Pruebas</title> <script type="text/javascript" src="pack.js"></script> </head> <body> <span id="some">aqui</span> <script type="text/javascript"> var mypack = new MyPackage.ClassOne(); mypack.Init(); </script> </body> </html>
this.Func1 is not a function ...
Vaya, con lo guay que me iba a quedar...
Haciendo mil pruebas me he dado cuenta de que al ejecutarse Func2 a través de un evento, el this de Func2 es el elemento que invoca ese método y no la clase tan chula que yo había hecho
De hecho si pongo mypack.Func2() después de llamar a mypack.Init() si que aparece el alert de Func1().
Entonces... si aun estáis leyendo esto... () supongo que habréis deducido que quiero que eso no pase... es decir... que siempre que llame a this éste haga referencia a la clase y no a cualquier otra cosa...
¿Algún tutorial sobre esto?
¿Alguna modificación sencilla?
¿Alguna forma alternativa para crear objetos en javascript? (estoy haciéndolo así porque lo he visto en otro paquete, no porque sepa que se hace así)...
Ojalá alguien me pueda echar un cable, un saludo!