0

对于 Firefox 扩展,我正在尝试执行以下操作:

  1. 使用两种方法和一个字段/属性/属性设置一个对象
  2. 其中一种方法必须能够调用另一种方法并访问属性
  3. 我想将该方法注册为事件侦听器。

现在,我把它设置成一个类:

var Obj = {
  field: null,
  a: function() { }
  b: function() {
    Obj.field = 'x';
    Obj.a();
  }
}

window.addEventListener('mouseup', Obj.b, false);

但似乎应该有可能让 mod 不“从外部”引用对象(例如通过使用Obj),而只是使用this。但是,我不知道如何让它正常工作,传递一个简单的函数引用,addEventListener() 并且(最好)只用一个名称污染命名空间。那可能吗?我尝试用谷歌搜索它并找到例如http://ejohn.org/blog/simple-class-instantiation/,但这似乎并没有导致符合我干净设置标准的东西。

4

2 回答 2

3

bind绝对是个好办法。但是,请注意,该addEventListener方法可以接受实现EventListener接口的对象,而不是函数:

var Obj = {
  field: null,
  a: function() { },
  b: function() {
    this.field = 'x'; // if you overrides `a` you can't call it
    this.a();
  },

  handleEvent: function(event) {
    switch(event.type) {
      case "mouseup":
         this.b();
         break;
    }
  }
}

window.addEventListener('mouseup', Obj, false);

如果您有多个与 相关的事件Obj,和/或如果您有同一个对象的多个实例(不是您的情况),这可能很有用。

于 2012-04-21T17:00:16.383 回答
3

使用 ES5bind函数:

var Obj = {
  field: null,
  a: function() { }
  b: function() {
    this.a = 'x';
    this.a();   //Note: not sure what you're trying to do, but calling a string like a function won't work.
  }
}

window.addEventListener('mouseup', Obj.b.bind(Obj), false);
于 2012-04-21T16:42:43.253 回答