Digamos que tengo una clase PrototypeJS muy simple que se ve así:

var Foo = Class.create({
  initialize:  function() {
    this.bar = 'bar';
  },

  dostuff:  function() {
    $$('.enabled').each( function(elem) {
      alert(this.bar);  //FAIL
    });
  }
});

Esto falla porque la función que se pasa a .each () no tiene idea de a qué se refiere this .

¿Cómo puedo acceder al atributo bar de la Clase desde esa función?

2
Mark Biek 8 jul. 2009 a las 00:48

3 respuestas

La mejor respuesta

Puede usar Función de enlace del prototipo, que 'bloquea el alcance de ejecución [de la función] en un objeto'.

var Foo = Class.create({
  initialize:  function() {
    this.bar = 'bar';
  },

  dostuff:  function() {
    $$('.enabled').each( function(elem) {
      alert(this.bar);
    }.bind(this)); // Set the execution scope to Foo
  }
});
1
Zack The Human 7 jul. 2009 a las 22:53

Hmmm, no soy un experto en prototipos, pero creo que esto podría ayudar a responder su pregunta - http://www.duncangunn.me.uk/dasblog/2009/05/26/ObjectorientedEventHandlingInJavascript.aspx

¡Avíseme si es así, si no es así, disculpas por perder el tiempo!

0
Duncan 7 jul. 2009 a las 20:55

Tratar:

dostuff:  function() {
   var that = this;

   $$('.enabled').each( function(elem) {
        alert(that.bar);  //FTW
   });
}

O pase un contexto a each():

dostuff:  function() {
   $$('.enabled').each( function(elem) {
        alert(this.bar);  //FTW
   }, this); // Context
}
2
Ates Goral 7 jul. 2009 a las 20:55