2016-01-22 6 views
8

Il seguente codice non riesce:come risolvere 'questo non è definito' quando si estende 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()); 

e stampe errore

this.name = 'foo'; 
    ^

ReferenceError: this is not defined 

Tuttavia quando non rivolgo EventEmitter funziona benissimo.

Perché sta succedendo e come posso risolverlo? running nodejs 4.2.1

+0

è necessario contrassegnare la risposta – weagle08

risposta

16

Quando si estende un'altra funzione, quindi super(..) dovrebbe essere la prima espressione nel proprio constructor. Solo così puoi usare this.

var EventEmitter = require('events'); 

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

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

E 'così perché, la classe che si sta derivanti da, dovrebbe essere data la possibilità di impostare le variabili, prima della classe corrente li ignora.

Inoltre, chiamando implicitamente il super() significa che stiamo passando undefined ai parametri dichiarati nello constructor del genitore. Questo è il motivo per cui non è fatto, per impostazione predefinita.

+0

Questa dovrebbe essere accettata come risposta corretta. – faizanjehangir

+0

Questa singola risposta mi ha insegnato molto sull'eredità della classe JS. –