2012-04-04 22 views
5

我如何獲得變量 in 處理程序函數obj?未參考obj in MyClass如何調用回調中的對象的鍵?

var obj = { 
     func: function(){ 
      var myClass = new MyClass(); 
      myClass.handler = this.handler; 
      myClass.play();   
     }, 

     handler: function(){ 
      //Here i don't have access to obj 
      console.log(this); //MyClass 
      console.log(this.variable); //undefined 
     }, 

     variable:true 
    }; 

    function MyClass(){ 
     this.play = function(){ 
      this.handler(); 
     }; 

     this.handler = function(){}; 
    }; 

    obj.func(); 

這就是建設需要你,如果你使用Base.js或OOP的另一個類似的方式。

_.bindAll(obj)(下劃線metod)也不適合。它在Base.js中突破重寫。

回答

2

綁定僅處理方法:這種從http://jsfiddle.net/uZN3e/1/

var obj = { 
    variable:true, 

    func: function(){ 
     var myClass = new MyClass(); 
     // notice Function.bind call here 
     // you can use _.bind instead to make it compatible with legacy browsers 
     myClass.handler = this.handler.bind(this); 
     myClass.play();   
    }, 

    handler: function(){ 
     console.log(this.variable); 
    } 
}; 

function MyClass(){ 
    this.play = function(){ 
     this.handler(); 
    }; 

    this.handler = function(){}; 
}; 

obj.func(); 
​ 
0

聲明variablehandler

var obj = { 
    variable: true, 

    func: function(){ 
     // ...  
    }, 

    handler: function(){ 
     console.log(this.variable); //true 
    } 
}; 
+2

不,它不工作。 [證明](http://jsfiddle.net/uZN3e/) – Boyo 2012-04-04 13:30:23

2

使用一個變量引用原始環境:

... 
var self = this; 
myClass.handler = function(){ self.handler(); }; 
... 
+0

嗯,我不這麼認爲。你建議在_func_函數中定義_handler_。但是,如果_func_會有很多聽衆,並且這些聽衆會很大,那麼您將獲得非常大的功能。我認爲這是糟糕的編程語氣。 – Boyo 2012-04-04 13:54:44

+1

事實上,'Function.bind'使用的是相同的東西,對性能也不好。你需要以不需要綁定的方式來構建你的代碼。 https://gist.github.com/2301514 - 你確實爲每個綁定函數創建了一個閉包(一個函數),並且你在該閉包中放置了上下文對象。所以這個答案也是有效的,對開發者來說更​​明顯,可能實際上更好(取決於你的需求) – 2012-04-04 14:22:49

+0

你說得對,關於性能。但是如何處理「但是如果func會有很多聽衆,這些聽衆會很大,你會得到很大的功能」?你認爲大功能可以嗎? – Boyo 2012-04-04 14:43:47

0

使用函數調用obj在var的範圍內聲明解決這個問題。

var obj = { 
    func: function(){ 
     var self = this; 
     var myClass = new MyClass(); 
     myClass.handler = function() { return this.handler.call(self); }; 
     myClass.play();   
    }, 

    handler: function(){ 
     //Here i don't have access to obj 
     console.log(this); //MyClass 
     console.log(this.variable); //undefined 
    }, 

    variable:true 
}; 
0

您沒有訪問,因爲這綁定到MyClass的構造函數實例OBJ - MyClass的。如果處理你想擁有通過訪問myClass的這個並獲得OBJ你必須使用OBJ名直接這樣:

console.log(this); // myClass 
console.log(obj.variable); // true 

如果你想擁有這個綁定到obj使用Juan Mellado或gryzzly的建議。