2015-09-15 14 views
24

Tôi đang chạy mã dưới đây vào nodejscách thực hiện `var self = this` trong lớp es6?

this.x = 'global x'; 
class Point { 
    constructor(x) { 
     this.x = x; 
    } 
    toString() { 
     return this.x; 
    } 
} 
var obj = new Point(1); 
obj.toString();// 1 as expected 
var a = obj.toString;// Here I can do something like var a = obj.toString.bind(obj); to get rid of the situation. But I am curious to know how can we write `var self = this`; 
a();// TypeError: Cannot read property 'x' of undefined 

a(); ném lỗi.
Làm cách nào để chúng tôi có thể thực hiện như var self = this; như chúng tôi đã từng thực hiện trong es5 để ngăn chặn tình huống như vậy?

+0

Bạn đang cố gắng làm gì với dòng đầu tiên của bạn this.x = 'global x'; ? –

+0

@Roumelis Tôi đã mong đợi 'a()' sẽ chạy trong mã toàn cục và 'toString()' trả về 'this.x' để' a() 'sẽ trả về' global x' – intekhab

+0

Bạn đang thêm x vào cửa sổ với mục đích sau đó? –

Trả lời

15

Làm cách nào chúng tôi có thể thực hiện như var self = this; như chúng tôi đã từng thực hiện trong ES5?

Bạn có thể làm điều đó một cách chính xác như bạn đã làm trong ES5 - ES6 là hoàn toàn tương thích ngược sau khi tất cả:

class Point { 
    constructor(x) { 
     this.x = x; 
     var self = this; 
     this.toString = function() { 
      return self.x; 
     }; 
    } 
} 

Tuy nhiên, đó thực sự không phải thành ngữ ES6 (không nói về const thay vì var). Bạn muốn sử dụng một chức năng mũi tên mà có một từ vựng-scoped this, do đó bạn có thể tránh self biến này hoàn toàn:

class Point { 
    constructor(x) { 
     this.x = x; 
     this.toString =() => { 
      return this.x; 
     }; 
    } 
} 

(mà thậm chí có thể được rút ngắn xuống còn this.toString =() => this.x;)

+0

nếu tôi đặt mã này 'this.toString = function() {return self.x; }; 'ra khỏi hàm tạo như thế này' toString() {return self.x; }; 'như chúng ta có thể làm điều này, Trong trường hợp này tự là' undefined' và ném lỗi – intekhab

+0

@intekhab: Có tất nhiên nó là - 'self' là một biến có phạm vi với hàm tạo. Như tôi đã nói, nó hoạt động giống như trong ES5. Cú pháp mới của lớp 'ES6' giới thiệu hầu như không có gì mới nhưng cú pháp *. – Bergi

11

Nếu bạn don' t muốn tạo tất cả các phương pháp lớp học của bạn bên trong constructor như Bergi gợi ý (mà có vẻ xấu xí với tôi) sau đó bạn có thể enable ES7 features và xác định phương pháp của bạn sử dụng cú pháp mũi tên:

class Point 
{ 
    constructor(x) 
    { 
     this.x = x; 
    } 

    toString =() => 
    { 
     return this.x; 
    } 
} 

này có cùng ảnh hưởng như nói:

constructor(x) 
{ 
    this.toString = this.toString.bind(this); 
} 

Nhưng nó vẫn không cho phép bạn truy cập vào động này và từ vựng này (tự) trong chức năng tương tự. Vì vậy, đây là không phải câu trả lời hoàn chỉnh.

Tôi hy vọng ai đó có thể chỉnh sửa câu trả lời này để cho biết cách chúng tôi có thể truy cập cả hai loại này trong phương thức lớp mà không xác định mọi phương thức trong hàm tạo lớp.

+3

Vâng, điều này vẫn tạo ra tất cả các phương thức của bạn bên trong hàm tạo (và chỉ là xấu xí), chỉ có nó sử dụng một cú pháp thử nghiệm cho nó. – Bergi

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