2015-09-15 17 views
24

私はnodejses6クラス内で `var self = this`を実行する方法は?

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();で以下のコードを実行していますが、エラーがスローされます。
このような状況を防ぐために、es5で行ったように、どうすればvar self = this;のようにすることができますか?

+0

最初の行で何をしようとしていますか?this.x = 'global x'; ? –

+0

@Roumelis 'a()'がグローバルコードで実行され、 'toString()'が 'this.x'を返すことを期待していたので' a() 'が' global x'を返します – intekhab

+0

それで? –

答えて

15

私たちはES5で以前のようにvar self = this;のようにできますか?

あなたはES5で全く同じようにあなたはそれを行うことができます - ES6は、すべての後に、完全に下位互換性があります:

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

しかし、それは本当に慣用ES6(約const代わりvarの話ではない)ではありません。あなたは完全にこのself変数を避けることができるようにするのではなく、字句スコープthisを持って矢印の機能を使用すると思います。(でもthis.toString =() => this.x;に短縮することができる)

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

+0

私はこのコードを置く 'this.toString = function(){return self.x; }; 'このようなコンストラクタから抜け出した' toString(){return self.x; }} '私たちはこれを行うことができます。この場合、selfは' undefined'でエラーを投げます。 – intekhab

+0

@intekhab:もちろんそうです - 'self'はコンストラクタにスコープされる変数です。私が言ったように、それはES5のように機能します。新しいES6の 'class'構文は、*構文*に新しいものはほとんどありません。 – Bergi

11

あなたはドンが」

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

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

これは同じを持っている:tはBergiが示唆するように、あなたは矢印構文を使用してメソッドを定義enable ES7 featuresとすることができます(私には醜い思われる)、コンストラクタ内のすべてのクラスのメソッドを作成したいです

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

をしかし、それはまだあなたが同じ機能でダイナミックこのと字句この自己)にアクセスすることはできませんと言っとしての効果。したがって、これはではなく、の完全な答えです。

この回答を編集して、クラスメソッドでの両方の型にアクセスする方法を示すことができたら、クラスコンストラクタのすべてのメソッドを定義することなく、

+3

これはまだコンストラクタ内のすべてのメソッドを作成します(ちょうど醜いです)。実験的な構文を使用します。 – Bergi

関連する問題