2011-03-03 60 views
0

如何傳遞Class實例的「this」上下文的變量代理?例如,this.saySomething()沒有達到我想要的效果。

您是否對OOJS代碼組織有任何其他建議?

// Truveo Video Player Class 
function Player(){ 

    // Player Defaults 
    this.opts = { 
     volume: 0 // Initial volume settings 
    }; 
} 

// Initialize player setup/methods 
Player.prototype.init = function(configs){ 

    // Overwrite defaults with custom configs 
    this.opts = $.extend(this.opts, configs); 

    $(document).ready(function(){ 
     this.saySomething(); 
    }); 
    $(window).load(function(){ 
     // do something else 
    }); 
} 

Player.prototype.saySomething = function(){ 
    alert(this.opts.volume); 
} 

// Create instance for channel surf 
var configs = {volume:10}; 
var cSurf = new Player(); 
cSurf.init(configs); 
+0

我確定你已經嘗試過了,但是看看'alert'(這個)''看看發生了什麼。 – s84 2011-03-03 01:59:59

回答

3

進入函數之前保存的this副本:

var me = this; 
$(document).ready(function(){ 
    me.saySomething(); 
}); 
+0

工作,但我很驚訝。我認爲創建一個var等同於其他地方無法訪問的私有變量? – Matrym 2011-03-03 02:02:38

+0

另外,在創建類中創建opts默認值是否正確?或者我應該在一些原型電話中這樣做? – Matrym 2011-03-03 02:03:56

+1

@Matrym,yes'var me'對'init'函數是私有的,但是因爲'.ready'的處理函數是在'init'內創建的,所以它獲得了一個**閉包**來捕獲對每個局部變量的引用在'init'中。 – 2011-03-03 02:04:34

1

除了correct answer@Box9,一種可能性是設置的this值整個.ready()電話。

你可以用jQuery.proxy()[docs]方法做到這一點。

$(document).ready($.proxy(function(){ 
    this.saySomething(); 
}, this)); 

現在使用者傳送過來的.ready()功能就會有你的Player對象的this值。

相關問題