2012-04-21 37 views
0

对于Firefox扩展,我想做到以下几点:传递一个绑定的对象方法在JavaScript

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

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

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

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

但现在看来似乎应该是可能有国防部没有提及“从外面”的对象(例如,通过使用Obj),但只改用this。然而,我无法弄清楚如何让这个工作正常,将一个简单的函数引用传递给addEventListener()(最好)只使用一个名字来污染命名空间。那可能吗?我尝试了谷歌搜索,发现http://ejohn.org/blog/simple-class-instantiation/,但这似乎并没有导致符合我干净设置标准的事情。

+0

JavaScript中'this'的值非常动态。它是一个*调用上下文*,这意味着它通常在函数被调用时设置,并且基于* how *的不同而被调用。您应该阅读关于“this”设置的各种方法的教程。有些是隐含的,有些是明确的。 – 2012-04-21 17:08:17

回答

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); 
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多个事件这可能是有用的,和/或如果你有多个实例相同的对象(不是你的情况)。

+0

+1学习新东西。 – Dennis 2012-04-21 17:08:55

+0

该问题的完美解决方案,谢谢! – djc 2012-04-21 17:10:34

相关问题