2016-03-23 5 views
1

Я не могу понять, как исправить контекст моих методов.javascript ES6 класс/метод scope

У меня есть этот класс:

export default class Handler { 

    constructor() { 
     // init 
    } 

    handleMessage(channel, user, message) { 
     this.handleDefault(channel, user, message); 
    } 

    handleDefault(chanenl, user, message) { 
     // do stuff 
    } 
} 

он вызывается этим методом и класса

export default class Bot { 

    constructor() { 
     this.irc  = irc // has an event emitter irc.event 
     this.handler = new Handler(); 
     this.readIRC(); 
    } 

    readIRC() { 
     this.irc.event.on('message', this.handler.handleMessage); 
    } 
} 

Проблема заключается в первом классе внутри handleMessage это не класс больше, но EventEmitter так Я не могу вызвать метод handleDefault.

Как правильно работать с контекстами в ES6?

+1

Вы, кажется, спрашивая о ** 'this' контексте **, не *объем*. – Bergi

ответ

4

Вы просто должны связать handleMessage с this.handler, либо с

  • Function.prototype.bind

    this.irc.event.on('message', this.handler.handleMessage.bind(this.handler)); 
    
  • или с функцией управления курсором,

    this.irc.event.on('message',() => this.handler.handleMessage()); 
    

В обоих случаях, когда функция handleMessage вызывается при событии message, this в пределах handleMessage будет ссылаться на объект this.handle.


Если вы хотите передать аргументы обработчика события, вы можете определить функцию стрелки, как этот

this.irc.event.on('message', (err, msg) => this.handler.handleMessage(err, msg)); 
+0

Если я использую функцию стрелки, как правильно передать аргументы. – gempir

+0

@ danielps1: Точно так же вы делаете это в 'handleMessage': определяете параметры и передаете их. Или используйте параметр параметра rest и spread. –

+0

о да. На самом деле у меня это было правильно, просто была глупая опечатка. Спасибо! – gempir