Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Mejor metodología para usar this cuando es innaccesible?

Estas en el tema de Mejor metodología para usar this cuando es innaccesible? en el foro de Javascript en Foros del Web. Hola, Tengo una consulta para averiguar si no me estoy equivocando o haciendo una mala práctica del lenguaje. Normalmente tengo que hacer referencia al objeto ...
  #1 (permalink)  
Antiguo 17/11/2014, 19:08
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Mejor metodología para usar this cuando es innaccesible?

Hola,

Tengo una consulta para averiguar si no me estoy equivocando o haciendo una mala práctica del lenguaje. Normalmente tengo que hacer referencia al objeto en el que estoy definiendo algunas o muchas funciones anónimas, pero en estas no tengo acceso a la palabra reservada this, lo cual me crea una estructura del lenguaje bastante compleja y creo (posiblemente) innecesaria.

Como no he visto muchas aplicaciones que lo hagan de la forma como yo lo realizo me pregunto si hay algo que estoy realizando mal, por ejemplo:

Código Javascript:
Ver original
  1. Mesa.prototype.crearTablero = function (ancho, alto, callback) {
  2.     this.tablero = new Tablero(ancho, alto, (function (mesa) {
  3.         return function () {
  4.             mesa.panel = document.getElementById("JPuzzleT");
  5.             if (mesa.panel) {
  6.                 mesa.panel.onclick = (function (mesa) {
  7.                     return function (evt) {
  8.                         mesa.mouseClickedHandler(evt);
  9.                     };
  10.                 })(mesa);
  11.                 callback();
  12.             }
  13.         };
  14.     })(this), (function (mesa) {
  15.         return function (origen, destino) {
  16.             mesa.stateChangedHandler(origen, destino);
  17.         };
  18.     })(this));
  19. };

En ese caso no me queda mas que crear una función anónima adicional que reciba un parámetro, donde le paso el this (en este caso mesa), para que el closure tenga acceso al this. El ejemplo es de una aplicación algo antigua adaptada de una aplicación que hice en Java, pero todavía se aplica.

Ahora bien, el problema es que ese fue un ejemplo sencillo a veces tengo que declarar muchas funciones que internamente definen muchas funciones y al final en cascada tengo n cantidad de funciones anónimas solamente con el objetivo de tener acceso al this.

¿Existe algún mejor método o patrón que no tenga que estar pasando el this de esa forma?

Saludos,
  #2 (permalink)  
Antiguo 17/11/2014, 19:31
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Mejor metodología para usar this cuando es innaccesible?

buenas...
no estoy del todo seguro qué exactamente quieras hacer, pero se me ocurren dos métodos. el primero creo que sería el más adecuado para tu caso. es similar a lo que estás haciendo: asignar this al argumento de la función. lo único que en este caso sería a una variable local del método que defines para el prototipo (crearTablero).

Código:
function Fn(){}

Fn.prototype.fn = function(){
var that = this;
this.prop = new Class(args, function(){
    // aqui operas con that;
    });
};
el otro método pudiera ser con apply, pero sería más útil si ya tuvieras definida la función.
Código:
function unnamed(){
// hacer algo con this;
}

function Fn(){}
Fn.prototype.fn = function(){
this.prop = new Class(args, function(){
    unnamed.apply(this);
    });
};
@edit: hay un tercer método que se llama bind(), nunca lo he usado pero debe servirte igual. hice un experimento rápido y basicamente es una forma corta de apply. a bind le pasas el objeto (this) y ella te devuelve una función que cuando se invoca, opera con el objeto que le has pasado.

Código:
function unnamed(){
// hacer algo con this;
}

function Fn(){}
Fn.prototype.fn = function(){
this.prop = new Class(args, unnamed.bind(this));
};
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 17/11/2014 a las 19:46
  #3 (permalink)  
Antiguo 18/11/2014, 18:11
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Mejor metodología para usar this cuando es innaccesible?

Hola,

Muchas gracias por tomarte el tiempo para revisar mi consulta,

Cita:
Iniciado por zerokilled Ver Mensaje
... no estoy del todo seguro qué exactamente quieras hacer, ...
Ahora que leo mi pregunta me doy cuenta que efectivamente está un poco confusa, pero de igual forma comprendiste bien el concepto.

Cita:
Iniciado por zerokilled Ver Mensaje
... el primero creo que sería el más adecuado para tu caso. es similar a lo que estás haciendo: asignar this al argumento de la función. lo único que en este caso sería a una variable local del método que defines para el prototipo (crearTablero).
El único inconveniente que miro en esa propuesta sería que mantengo una referencia a this, en Java no es ningún problema porque la forma en que funciona el Garbage Collector, pero en Javascript, dependiendo del objeto o mas bien la cantidad de objetos podría ser problematico, según comprendo el GC de Javascript nunca va a soltar esas referencias, aunque ya no exista otra referencia a Fn, el mismo mantiene una referencia a si mismo, valga la redundancia, aunque no estoy completamente seguro de eso.

Cita:
Iniciado por zerokilled Ver Mensaje
el otro método pudiera ser con apply, pero sería más útil si ya tuvieras definida la función.
Esa me parece mejor, con el único inconveniente, para mí en lo personal unicamente, que tendría funciones sueltas, o por decirlo de otra forma, objetos sueltos para poder aplicarles el método apply. Aunque posiblemente no he comprendido bien el concepto, posiblemente podría hacerlas como Clases internas, voy a revisar ese método.

Cita:
Iniciado por zerokilled Ver Mensaje
... hay un tercer método que se llama bind(), nunca lo he usado pero debe servirte igual. hice un experimento rápido y basicamente es una forma corta de apply. a bind le pasas el objeto (this) y ella te devuelve una función que cuando se invoca, opera con el objeto que le has pasado.
Se mira interesante, voy a revisalo mas detenidamente, posiblemente este sea el mejor método que ando buscando.

Muchas gracias de nuevo, voy a hacer pruebas con tus propuestas para ver cual se adapta mejor a lo que necesito hacer en general.

Saludos,
  #4 (permalink)  
Antiguo 22/11/2014, 20:50
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Mejor metodología para usar this cuando es innaccesible?

Hola,

Cita:
Iniciado por zerokilled Ver Mensaje
... @edit: hay un tercer método que se llama bind(), nunca lo he usado pero debe servirte igual. hice un experimento rápido y basicamente es una forma corta de apply. a bind le pasas el objeto (this) y ella te devuelve una función que cuando se invoca, opera con el objeto que le has pasado.
...
Excelente, ya investigue mas la función, exactamente bind hace lo mismo que yo estaba haciendo pero yo lo hacía manualmente, creaba la función a mano y le pasaba el this como un parámetro, aunque internamente lo usaba con otro nombre (el nombre del parámetro).

Usando bind() hace exactamente lo mismo pero sin estar creando el montón de funciones, y el this, realmente se llama this (y es el this que me interesa) dentro de la función.

De nuevo, te lo agradezco mucho,

Saludos,

Etiquetas: diseño, patron
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 20:00.