2015-08-22 74 views
0
class Foo extends EventEmitter { 
    constructor(name) { 
     this.name = name; 
    } 
    funcA(sourceRepositoryPath, branch) { 

     this.emit('log', 'Hello from Foo'); 

     var bar = new Bar(); 
     bar.on('log', function(log) { 
      this.emits('log', 'Hello from Foo from Bar'); 
     }); 
    } 
} 

我如何使用從富所述發送功能bar.on裏面......之類的函數在ES6的的NodeJS/JavaScript中訪問父類的方法在嵌套類

this.emit('log', 'Hello from Foo'); 

功能?

var foo = new Foo(); 
foo.funcA(); 

foo.on('log', function(log) { 
    // expects : Hello from Foo && Hello from Foo from Bar 
    // gets : Hello From Foo 
}); 
+0

爲什麼人們總是寫「EC6」?這個詞用在哪裏? – Bergi

+0

我只是縮短了Ecmacript 6,但我不知道它是否常用。 – orbatschow

+0

標準縮寫是ES6(來自[ECMA](https://en.wikipedia.org/wiki/Ecma_International) - [Script](https://en.wikipedia.org/wiki/ECMAScript))。我只是想知道,因爲我已經多次看過「EC6」,但它確實沒有任何意義:-) – Bergi

回答

1

箭頭函數的語法解決了這個確切的問題:

class Foo extends EventEmitter { 
    constructor(name) { 
     this.name = name; 
    } 

    funcA(sourceRepositoryPath, branch) { 
     this.emit('log', 'Hello from Foo'); 

     var bar = new Bar(); 
     bar.on('log', (log) => { 
      this.emits('log', 'Hello from Foo from Bar'); 
     }); 
    } 
} 

除了較短的,更簡潔的語法,箭頭功能定義一個「詞彙this」,意思是一個箭頭函數內this關鍵字解析爲實例功能被定義的地方。

1

你有bar.on()處理程序中不同的環境,所以你需要或者綁定到外部範圍:

bar.on('log', function(log) { 
    this.emits('log', 'Hello from Foo from Bar'); 
}.bind(this)); 

或保持對它的引用:

var self = this; 
bar.on('log', function(log) { 
    self.emits('log', 'Hello from Foo from Bar'); 
}); 

或者當您使用ES6/ES2015時,您可以使用箭頭功能來保持外部綁定(並且您的轉換器將爲您執行上述操作之一):

bar.on('log', (log) => { 
    self.emits('log', 'Hello from Foo from Bar'); 
}); 

希望它有幫助!