2016-04-08 14 views
6

Lớp es6 mới cho phép bạn sử dụng biến tham chiếu tự this các phương thức bên trong.
Tuy nhiên, nếu một phương pháp lớp có một chức năng phụ hoặc gọi lại, mà chức năng/callback không còn có quyền truy cập vào biến tài liệu tham khảo tự this
es6 Lớp Javascript sử dụng điều này bên trong một cuộc gọi lại

class ClassName { 
    constructor(dir){ 
    this.dir = dir; 
    fs.access(this.dir, fs.F_OK | fs.W_OK, this.canReadDir);//nodejs fs.access with callback 
    } 

    canReadDir(err){ 
    this.dir;// NO ACCESS to class reference of this 
    } 
    //OR 
    aMethod(){ 
    function aFunc(){ 
     this.dir;// NO ACCESS to class reference of this 
    } 
    } 
} 

Có bất kỳ giải pháp này?

+1

Bạn có thể tạo hàm mũi tên thay vì 'const aFunc =() => this.dir;' – zerkms

+0

Sử dụng [chức năng mũi tên] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/ Hàm/Arrow_functions # Lexical_this). –

+1

"* Lớp es6 mới cho phép bạn sử dụng biến tham chiếu tự này trong các phương thức này. *" - uh, không, điều này không liên quan gì đến cú pháp 'lớp' của ES6. Từ khóa 'this' hoạt động giống như nó luôn làm trong các phương thức. – Bergi

Trả lời

14

Bạn có các tùy chọn sau:

1) Sử dụng một mũi tên chức năng:

class ClassName { 
    // ... 
    aMethod(){ 
    let aFun =() => { 
     this.dir;// ACCESS to class reference of this 
    } 
    } 
} 

2) Hoặc phương pháp bind():

class ClassName { 
    // ... 
    aMethod(){ 
    var aFun = function() { 
     this.dir;// ACCESS to class reference of this 
    }.bind(this); 
    } 
} 

3) Lưu trữ this trong một biến chuyên ngành:

class ClassName { 
    // ... 
    aMethod(){ 
    var self = this; 
    function aFun() { 
     self.dir;// ACCESS to class reference of this 
    } 
    } 
} 

This article mô tả các chi tiết cần thiết về this và mũi tên hàm trong JavaScript.

+0

Không phải là từ tự bảo tồn? –

+0

@ Bálint Không. 'self' có thể được sử dụng. –

+0

Cảm ơn rất nhiều –

0

Đặt một tham chiếu đến dir trong aMethod(), sau đó sử dụng trong aFunc như

aMethod() { 
    var tempDir = this.dir; 
    aFunc() { 
     console.log(tempDir); 
    } 
} 
+0

Sử dụng 'var self = this;' hoặc 'var that = this;' và việc sử dụng sau này đã là một thực hành khá rõ ràng cho mục đích đó. – Monish

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