2012-04-30 69 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價值?我基本上試圖從最後一點畫一條線(使用畫布)到剛纔單擊的座標。

[編輯]

我不想綁定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) 
    } 
});  

裝飾保持的參考。

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

指向myClass的方法,可以處理它:

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

2-ND一個 - 通過存儲的引用被優選的,因爲較小的足跡和普遍的支持而.bind不可用在每一個瀏覽器中都需要被刷新以及額外的時間來執行功能。

self是你可以在mootools-core中找到的東西。

如果性能沒有風險,方法3可能會提供最佳的可讀性和代碼結構。該方法的參數將保持點擊處理程序通過的內容,即eventevent.target將作爲處理程序。重新綁定上下文可以在頸部

疼痛 -

在圖案#2 selfthis將指向點擊處理匿名函數內(或到另一個類,例如),這可能是有用的,以及

+0

Ahhhhh!我總是把'var _self = this'放在initialize方法中。 – beingalex

+0

ahhh我記得有一次在Mootools IRC上對此有過激烈的爭論。好的舊時光=) – kjy112

+1

@ kjy112還是感覺莫託庫的戒斷症狀? :D –

2

你可以參考合適的背景是這樣的:

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

嗨。感謝你的回答。對不起,我不能接受兩個。 – beingalex