2011-06-13 16 views
8

अगर मैं इस तरह एक समारोह है:कॉलर फ़ंक्शन के 'यह' मूल्य कैसे प्राप्त करें?

function foo(_this) { 
    console.log(_this); 
} 

function bar() {} 
bar.prototype.func = function() { 
    foo(this); 
} 

var test = new bar(); 
test.func(); 

तो bar की test उदाहरण लॉग होता है।

हालांकि, इसके लिए काम करने के लिए मुझे फ़ंक्शन में this पास करना होगा। मैं सोच रहा था कि this पास बिना this मान प्राप्त करना संभव है या नहीं।

मैंने arguments.callee.caller का उपयोग करने का प्रयास किया, लेकिन यह प्रोटोटाइप फ़ंक्शन को वापस लौटाता है और प्रोटोटाइप फ़ंक्शन के अंदर this मान नहीं देता है।

क्या प्रोटोटाइप फ़ंक्शन में केवल foo() पर कॉल करके bar का उदाहरण लॉग करना संभव है?

+1

नहीं आप कार्यों के ऊपर कॉल स्टैक संदर्भ का उपयोग नहीं कर सकते हैं। आपको इस संदर्भ को साथ पास करना होगा। – Raynos

+0

क्या कोई कारण है कि आप 'इस' को पारित नहीं करना चाहते हैं यदि आप पहले से ही बार के प्रोटोटाइप से जुड़े लॉगिंग के लिए एक विशेष उद्देश्य फ़ंक्शन बनाने जा रहे हैं? क्या इस पैटर्न का उपयोग करने के लिए सीखने के उद्देश्यों के अलावा कोई कारण है? – TNi

+0

@ टीएनआई: यह आवश्यक रूप से एक प्रैक्टिकल उद्देश्य नहीं है, लेकिन यह मेरे परिदृश्य में उपयोगी होगा। मैं एक फ़ंक्शन को फ़ंक्शन और सीमाओं को पार करके लूप के लिए एक बहु-स्तर बनाने की कोशिश कर रहा हूं, जो फ़ंक्शन को निष्पादित करता है क्योंकि यह लूप के साथ होगा।लूप के लिए नियमित रूप से, कोई 'इस' तक पहुंच सकता है, लेकिन इस तरह ऐसा लगता है कि मुझे अपने कार्य में' यह 'पास करने की आवश्यकता है। – pimvdb

उत्तर

3

तो सवाल यह है कि उसके बाद का जवाब 'इस गुजर (किसी भी तरह से) के बिना' कोई

फ़ायदेमंद साबित हो सकती है हालांकि वैकल्पिक तरीकों से पारित किया गया। उदाहरण के लिए वैश्विक var (बार कक्षा के भीतर) या सत्र या कुकीज़ का उपयोग कर।

function bar() { 

     var myThis; 

     function foo() { 
      console.log(myThis); 
     } 

     bar.prototype.func = function() { 

      myThis = this; 
      foo(); 
     } 
    } 

    var test = new bar(); 
    test.func(); 
+2

द्वारा बनाई गई घटना होने के कारण आप अभी भी 'इस' को पास कर रहे हैं। मुझे 'foo.apply (यह)' बहुत साफ/कम हैकिश मिल गया है। – Raynos

+1

मैं इसे चारों ओर पास नहीं कर रहा हूं, लेकिन एक चर के लिए मूल्य निर्धारित करना जो बार वर्ग के नामस्थान के भीतर पहुंच योग्य है। यह करने का यह एक अच्छा और सही तरीका है। –

+1

@ रेनॉस: यह सही है, लेकिन मैंने यह कहने के कारण स्वीकार किया कि यह संभव नहीं है। वह मूल रूप से मेरे प्रश्न का उत्तर देता है। – pimvdb

1

मैं bar के संदर्भ में foo बुला लगता है कि काम करना चाहिए:

function foo() { 
    console.log(this.testVal); 
} 

function bar() { this.testVal = 'From bar with love'; } 
bar.prototype.func = function() { 
    foo.call(this); 
} 

var test = new bar(); 
test.func(); //=> 'From bar with love' 
+0

धन्यवाद लेकिन मुझे अभी भी 'इस' मान को पारित करने की आवश्यकता है। मेरा मतलब यह है कि मैं 'foo 'के अंदर' foo ') को' func' 'के अंदर कॉल करके' इस 'को' foo 'के अंदर प्राप्त करने में सक्षम होना चाहिए। – pimvdb

+0

लेकिन एहर, यह वही होता है, या मैंने आपके प्रश्न को गलत समझा? मेरे उत्तर में कॉलिंग foo ''' को 'f' के लिए उपलब्ध' test' से बनाता है, जैसा कि 'लॉग' के माध्यम से testVal प्रॉपर्टी लॉगिंग करके प्रदर्शित किया गया है। – KooiInc

+0

मुझे स्पष्ट होने के लिए वास्तव में खेद है। मेरा मतलब था 'फू' के भीतर 'fun'' के ''' 'को प्राप्त करने के बिना * वास्तव में' func' में ''' को पारित करना। – pimvdb

0

आप बाहरी फ़ंक्शन को बदलने के बिना ऐसा कर सकते हैं, लेकिन आपको इसे कॉल करने के तरीके को बदलना होगा।

आप कॉलर का संदर्भ नहीं प्राप्त कर सकते हैं, लेकिन आप apply या call विधि के साथ कॉल किए गए फ़ंक्शन पर this प्रॉपर्टी सेट कर सकते हैं। this पर स्पष्टीकरण के लिए this reference देखें।

function foo() 
{ 
    console.log(this); 
} 

function bar() 
{ 
    bar.prototype.func = function func() 
    { 
     foo.apply(this); 
    }; 
} 

var test = new bar(); 
test.func(); 

आमतौर पर अगर this प्रयोग किया जाता है, यह एक वस्तु उन्मुख संदर्भ में है। किसी ऑब्जेक्ट की किसी अन्य विधि को कॉल करने का प्रयास करने से यह खराब डिज़ाइन का संकेत दे सकता है। अधिक लागू डिज़ाइन पैटर्न के लिए आप जो कुछ हासिल करने की कोशिश कर रहे हैं, उसे थोड़ा और समझाएं।

जावास्क्रिप्ट ओओपी प्रतिमान के उदाहरण के लिए, my answer here देखें।

1

इसके बारे में क्या?

"use strict"; 
var o = { 
    foo : function() { 
     console.log(this); 
    } 
} 

function bar() {} 
bar.prototype = o; 
bar.prototype.constructor = bar; 
bar.prototype.func = function() { 
    this.foo(); 
} 

var test = new bar(); 
test.func(); 

या इस:

"use strict"; 
Function.prototype.extender = function(o){ 
    if(typeof o == 'object'){ 
     this.prototype = o; 
    }else if (typeof o == 'function') { 
     this.prototype = Object.create(o.prototype); 
    }else{ 
     throw Error('Error while extending '+this.name); 
    } 
    this.prototype.constructor = this; 
} 
var o = { 
    foo : function() { 
     console.log(this); 
    } 
} 

function bar() {} 
bar.extender(o); 
bar.prototype.func = function() { 
    this.foo(); 
} 

var test = new bar(); 
test.func(); 
संबंधित मुद्दे