2012-04-21 3 views
0

Для расширения Firefox, я пытаюсь сделать следующее:Передача метода связанного объекта в JavaScript

  1. Setup объект с двумя методами и поля/свойства/атрибута
  2. Один из методов должен иметь возможность вызвать другой метод и получить доступ к атрибуту
  3. Я хочу зарегистрировать этот метод как прослушиватель событий.

Прямо сейчас, у меня есть это установка как класс:

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

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

Но мне кажется, что это должно быть возможно иметь мод не относятся к объекту «извне» (например, с помощью Obj), но вместо этого вместо этого используется только . Тем не менее, я не могу понять, как заставить это работать правильно, простую ссылку на addEventListener()и (желательно), только загрязняя пространство имен одним именем. Это возможно? Я попробовал поиск по сайту и нашел, например. http://ejohn.org/blog/simple-class-instantiation/, но это, похоже, не привело к чему-то, что соответствует моим критериям чистой установки.

+0

Значение 'this' в JavaScript очень динамично. Это * вызывающий контекст *, означающий, что он обычно задается при вызове функции и отличается в зависимости от того, как * он был вызван. Вероятно, вам следует прочитать учебное пособие по различным способам настройки 'this'. Некоторые из них являются неявными, некоторые из них явными. –

ответ

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

+0

Идеальное решение проблемы, спасибо! – djc

Смежные вопросы