2012-04-04 15 views
5

मैं obj की चर में हैंडलर समारोह कैसे मिल सकता है? objMyClass में संदर्भ के बिना।कॉलबैक के अंदर ऑब्जेक्ट की कुंजी कैसे कॉल करें?

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) (अंडरस्कोर मेटोड) भी उपयुक्त नहीं है। बेस.जे.एस. में ब्रेक ओवरराइडिंग

उत्तर

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 self = this; 
myClass.handler = function(){ self.handler(); }; 
... 
+2

नहीं, यह काम नहीं करता है। [सबूत] (http://jsfiddle.net/uZN3e/) – Boyo

2

मूल संदर्भ उल्लेख करने के लिए एक चर का उपयोग करें एक दायरे में घोषित में obj var इसे हल करो। myClass -

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

हमम, मुझे ऐसा नहीं लगता है। आप _func_ फ़ंक्शन के अंदर _handler_ को परिभाषित करने का सुझाव देते हैं। लेकिन अगर _func_ में कई श्रोताओं होंगे, और ये श्रोताओं बड़े होंगे, तो आपको बहुत बड़ा काम मिल जाएगा। मुझे लगता है कि यह प्रोग्रामिंग का बुरा स्वर है। – Boyo

+1

वास्तव में, 'Function.bind' एक ही चीज़ का उपयोग कर रहा है और प्रदर्शन के लिए भी बुरा है। आपको अपने कोड को इस तरह से व्यवस्थित करने की आवश्यकता है कि इस तरह की बाइंडिंग की आवश्यकता नहीं होगी। https://gist.github.com/2301514 - आप प्रत्येक बाध्य कार्यों के लिए एक बंद (एक फ़ंक्शन) बनाते हैं और आप उस बंद होने के भीतर संदर्भ ऑब्जेक्ट डालते हैं। तो यह उत्तर भी मान्य है और डेवलपर के लिए अधिक स्पष्ट होने के नाते, वास्तव में बेहतर हो सकता है (आपकी आवश्यकताओं के आधार पर) –

+0

आप सही प्रदर्शन के बारे में सही हैं। लेकिन इसके साथ क्या करना है "लेकिन अगर func में कई श्रोताओं होंगे, और ये श्रोताओं बड़े होंगे, तो आपको बहुत बड़ा काम मिलेगा"? आपको लगता है कि बड़े काम ठीक है? – Boyo

0

उपयोग समारोह कॉल

var obj = { 
    variable: true, 

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

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

आप obj क्योंकि इस MyClass निर्माता के कहने के लिए बाध्य किया जाता है करने के लिए पहुँच नहीं है। आप obj नाम सीधे तो उपयोग करने के लिए हैंडलर में आप के माध्यम से obj को यह और पहुँच myClass के लिए उपयोग करना चाहते हैं:

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

आप इस करना चाहते हैं ओबीजे से जुड़ा हुआ जुआन मेलडो या ग्रिज़ली ने सुझाव दिया।

संबंधित मुद्दे