2012-04-30 11 views
2

このクラスを取る:MooToolsはクラス変数のスコープ

var MyClass = new Class({ 
    Implements: [Events, Options], 
    initialize: function() { 

     this.a = 1; 

    }, 

    myMethod: function() { 

     var mc = new differentClass({ 
      events: { 
       onClick: function() { 

        console.log(this.a); // undefined (should be 1, 2, 3 etc) 

        this.a ++; 


       } 
      } 
     });  

    } 
}); 

私は this.a の値を保つにはどうすればよいですか?私は基本的に、最後の点からちょうどクリックされた座標までの線(キャンバスを使用)を描画しようとしています。

[EDIT]

私はそれが明らかに悪いようthis結合し、それがdifferentClassオプションをオーバー乗るたくありません。

答えて

4

いくつかのパターンが用意されています。参照を維持.bind()

var mc = new differentClass({ 
    events: { 
     click: function() { 
      console.log(this.a); 
      this.a ++; 
     }.bind(this) // binds the scope of the function to the upper scope (myclass) 
    } 
});  

介し

デコレータ。それに対処することができるMYCLASS方法を指す

var self = this; // reference parent instance of myClass 
var mc = new differentClass({ 
    events: { 
     click: function() { 
      console.log(self.a); 
      self.a ++; 
     } 
    } 
});  

handleClick: function() { 
    this.a++; 
}, 
myMethod: function() { 
    var mc = new differentClass({ 
     events: { 
      click: this.handleClick.bind(this) 
     } 
    });  
} 

1つの2番目 - .bindが利用できないのに対し、より小さなフットプリントおよびユニバーサル支持体に好ましい参照を格納することによってすべてのブラウザでシムにする必要があるだけでなく、実行時に関数をカレーする余分な時間が必要です。

selfは、可能であればmootools-core自体にあります。

パフォーマンスが危険でない場合、方法3はおそらく最高の可読性とコード構造を提供します。メソッドの引数はクリックハンドラに渡されます。つまり、eventおよびevent.targetがハンドラになります。 selfとパターン#2で

thisは同様に有用であり得る(または他のクラスには、例えば)匿名関数内のクリックハンドラをポイントする - 再バインドコンテキストは首の痛みとすることができる

+0

ああ!私はいつも 'var _self = this'をinitializeメソッドに入れていました。 – beingalex

+0

ahhh私はMootools IRCでこれに関して熱い議論があったことを覚えています。良い古い日=) – kjy112

+1

@ kjy112まだmootools離脱症状を感じる? :D –

2

あなたは、このように適切なコンテキストを参照することができます。

... 
myMethod: function() { 
    var _this = this; 
    var mc = new differentClass({ 
     events: { 
      onClick: function() { 
       console.log(_this.a); 
       _this.a ++; 
      } 
     } 
    });  
} 
... 
+0

こんにちは。答えをありがとう。私は2つを受け入れることはできません – beingalex