javascript ES6类/方法范围

时间:2016-03-23 15:59:37

标签: javascript ecmascript-6 scopes

我无法弄清楚如何纠正方法的背景。

我有这堂课:

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 个答案:

答案 0 :(得分: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));