2012-04-21 39 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

相關問題