2016-01-22 25 views
8

Các mã sau thất bại:cách giải quyết 'điều này không được xác định' khi mở rộng 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()); 

và in lỗi

this.name = 'foo'; 
    ^

ReferenceError: this is not defined 

Tuy nhiên khi tôi không mở rộng EventEmitter nó hoạt động tốt.

Tại sao điều này xảy ra và làm cách nào tôi có thể giải quyết vấn đề này? chạy nodejs 4.2.1

+0

bạn nên đánh dấu câu trả lời – weagle08

Trả lời

16

Khi bạn đang mở rộng một chức năng khác, thì super(..) phải là biểu thức đầu tiên trong số constructor của bạn. Chỉ khi đó bạn mới có thể sử dụng this.

var EventEmitter = require('events'); 

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

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

Điều này giống như vậy, vì lớp học bạn sinh ra, nên có cơ hội đặt biến, trước khi lớp hiện tại ghi đè chúng.

Ngoài ra, ngầm gọi super() có nghĩa là, chúng tôi đang chuyển undefined đến các tham số được khai báo trong số constructor của phụ huynh. Đó là lý do tại sao nó không được thực hiện, theo mặc định.

+0

Điều này sẽ được chấp nhận làm câu trả lời đúng. – faizanjehangir

+0

Câu trả lời duy nhất này đã dạy tôi rất nhiều về kế thừa lớp JS. –

Các vấn đề liên quan