在JavaScript中传递绑定对象方法

时间:2012-04-21 16:34:36

标签: javascript

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

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

    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/,但这似乎没有达到符合我干净设置标准的东西。

2 个答案:

答案 0 :(得分:3)

使用ES5 bind功能:

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

答案 1 :(得分: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相关的事件,和/或如果您有多个同一对象的实例(不是您的情况),这将非常有用。