2016-01-22 8 views
8

Poniższy kod nie powiedzie się:jak rozwiązać "nie jest to zdefiniowane" podczas rozszerzania EventEmitter?

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()); 

i drukuje błąd

this.name = 'foo'; 
    ^

ReferenceError: this is not defined 

Jednak kiedy nie jestem rozszerzenie EventEmitter to działa dobrze.

Dlaczego tak się dzieje i jak mogę to rozwiązać? z systemem nodejs 4.2.1

+0

powinieneś oznaczyć odpowiedź – weagle08

Odpowiedz

16

Podczas rozszerzania innej funkcji, super(..) powinno być pierwszym wyrażeniem w twoim constructor. Tylko wtedy możesz użyć this.

var EventEmitter = require('events'); 

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

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

Jest tak dlatego, że klasa jesteś wynikające z, powinien mieć szansę, aby ustawić zmienne, zanim obecna klasa nadpisuje je.

Ponadto, niejawnie wywołanie super() oznacza, że ​​przekazujemy undefined do parametrów, które są zadeklarowane w constructor elementu nadrzędnego. Dlatego domyślnie nie jest to robione.

+0

To powinno być akceptowane jako poprawna odpowiedź. – faizanjehangir

+0

Ta pojedyncza odpowiedź nauczyła mnie tyle o dziedziczeniu klasy JS. –