【问题标题】:how to resolve 'this is not defined' when extending EventEmitter? [duplicate]扩展EventEmitter时如何解决“未定义”? [复制]
【发布时间】:2016-04-29 02:18:06
【问题描述】:

以下代码失败:

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

【问题讨论】:

  • 你应该标记答案

标签: javascript node.js class ecmascript-6


【解决方案1】:

当你扩展另一个函数时,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 中声明的参数。这就是为什么默认情况下它没有完成。

【讨论】:

  • 这应该被接受为正确答案。
  • 这个单一的答案教会了我很多关于 JS 类继承的知识。
猜你喜欢
  • 2017-05-31
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多