在PrototypeJS类的类方法中提供函数访问类成员

时间:2009-07-07 20:48:39

标签: javascript oop prototypejs

假设我有一个非常简单的PrototypeJS类,如下所示:

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

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

这会失败,因为传递给 .each()的函数不知道这个所指的是什么。

如何从该函数中访问Class的 bar 属性?

4 个答案:

答案 0 :(得分:2)

尝试:

dostuff:  function() {
   var that = this;

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

或者,将上下文传递给each()

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

答案 1 :(得分:1)

你可以使用Prototype's bind function,它将'[函数]的执行范围锁定到一个对象'。

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
  }
});

答案 2 :(得分:0)

嗯,我不是原型专家,但是我想这可能有助于回答你的问题 - http://www.duncangunn.me.uk/dasblog/2009/05/26/ObjectorientedEventHandlingInJavascript.aspx

如果有的话,请告诉我,如果没有,请为浪费时间而道歉!

答案 3 :(得分:0)

当你在每个()中时,这个指的是每个都在迭代的内容。如果该类只有一个实例,则将所有这些替换为Foo。

var Foo = Class.create({
bar : "bar",

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

如果你无法逃脱警报(吧);