在 JavaScript 中传递绑定对象方法

Passing a bound object method in JavaScript

本文关键字:绑定 对象 方法 JavaScript      更新时间:2023-09-26

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

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

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相关的事件,和/或您有多个同一对象的实例(不是您的情况),这会很有用。