如何解决'这是没有定义的'何时扩展EventEmitter?

时间:2016-01-22 13:05:08

标签: javascript node.js class ecmascript-6

以下代码失败:

var EventEmitter = require('events'); 

class Foo extends EventEmitter{
    constructor(){
        this.name = 'foo';
    }
    print(){
        this.name = 'hello';
        console.log('world');
    }
}
var f = new Foo();
console.log(f.print());

并打印错误

 this.name = 'foo';
    ^

ReferenceError: this is not defined

然而,当我没有扩展EventEmitter时,它工作正常。

为什么会发生这种情况,我该如何解决? 运行nodejs 4.2.1

1 个答案:

答案 0 :(得分:18)

当您扩展其他功能时,super(..)应该是constructor中的第一个表达式。只有这样,您才能使用this

var EventEmitter = require('events');

class Foo extends EventEmitter {
    constructor() {
        super();
        this.name = 'foo';
    }
    print() {
        console.log(this.name);
    }
}

new Foo().print();
// foo

就像这样,因为你所派生的类应该有机会在当前类覆盖它们之前设置变量。

此外,隐式调用super()意味着,我们将undefined传递给在父项的constructor中声明的参数。这就是默认情况下没有完成的原因。