2011-03-22 18 views
7

में फ़ंक्शन होता है तो मुझे लगता है कि फ़ंक्शन रिटर्न न केवल परिणाम बल्कि फ़ंक्शन देता है। नीचे दिया गया उदाहरण दिखाता है कि फ़ंक्शन getWindow फ़ंक्शन देता है। यह सिर्फ वैरिएबल "जीत" क्यों नहीं लौटा सकता है? जब मैं परिणाम देता हूं और कार्य करता हूं? धन्यवाद।जब फ़ंक्शन रिटर्न परिणाम देता है और जब जावास्क्रिप्ट

var A = function(){}; 
A.prototype= 
{ 
    getWindow : function() 
    { 
     var win = new B.window(); 
     return (
       this.getWindow = function() 
       { 
        return win; 
       })(); 

    } 
} 

उत्तर

4

यह कोड आपके कोड के बराबर है लेकिन समझना आसान है:

A.prototype = { 
    getWindow: function() { 

     var win = new B.window(); 

     this.getWindow = function() { 
      return win; 
     }; 

     return win; 

    } 
} 

उपयोग:

सबसे पहले, एक एक उदाहरण बनाने के लिए:

var a = new A(); 

फिर, कॉल उस उदाहरण पर getWindow:

a.getWindow(); 

यहां, getWindowA.prototype की विधि कहा जाता है। आप ऊपर मेरी कोड में देख सकते हैं, A.prototype.getWindow लेकिन बीच में, यह भी उदाहरण वस्तु पर ही एक getWindow विधि पैदा करेगा, एक new B.window() और वापसी यह पैदा करेगा।

अब

, यदि आप getWindow फिर से फोन:

a.getWindow(); 

A.prototype.getWindowनहीं रह गया है कहा जाता है क्योंकि उदाहरण वस्तु अपने आप में एक getWindow विधि है। यह विधि उसी "जीत" ऑब्जेक्ट को लौटाती है जो पहली बार getWindow विधि को कॉल करने पर वापस लौटा दी गई थी।


आपका पैटर्न कई के लिए A उदाहरणों में एक ही A.prototype.getWindow विधि का उपयोग करने के लिए अपने स्वयं वस्तुओं "जीत" का दृष्टांत देता है। इस पर विचार करें:

var a1 = new A, 
    a2 = new A, 
    a3 = new A; 

a1.getWindow(); // creates window W1 and returns it 
a2.getWindow(); // creates window W2 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 

a3.getWindow(); // creates window W3 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 
a3.getWindow(); // returns window W3 

यह काफी उपयोगी पैटर्न है :)


अद्यतन:

यह आपके कोड है:

return (this.getWindow = function() { 
    return win; 
})(); 

पहले, आइए एक नजर डालें माता-पिता के अंदर अभिव्यक्ति पर:

this.getWindow = function() { return win; } 

जैसा कि आप देख सकते हैं, यह एक असाइनमेंट अभिव्यक्ति है। this (इंस्टेंस ऑब्जेक्ट) द्वारा संदर्भित ऑब्जेक्ट की getWindow संपत्ति को एक अज्ञात फ़ंक्शन ऑब्जेक्ट असाइन किया गया है।

ध्यान दें कि यह फ़ंक्शन win ऑब्जेक्ट देता है।

इस असाइनमेंट अभिव्यक्ति का परिणाम फ़ंक्शन ऑब्जेक्ट ही है! इसका मतलब है कि माता-पिता के अंदर मान फ़ंक्शन ऑब्जेक्ट है। , आप देख सकते हैं

return the_function_object(); 

समारोह:

return (the_function_object)(); 

हम कोष्ठक हटा सकते हैं के बाद से हम उन्हें और आवश्यकता नहीं है:

अब, चलो पूरी तस्वीर पर एक नज़र डालें ऑब्जेक्ट कहा जाता है, और तब उस फ़ंक्शन का रिटर्न वैल्यू वापस कर दिया जाता है।

जैसा ऊपर बताया गया है, फ़ंक्शन win देता है। इसलिए, कोड इस पर ले कर जाता:

return win; 

तो क्या अपने कोड करता है: सबसे पहले

, यह this.getWindow को function() { return win; } प्रदान करती है।

SECOND, यह उस कार्य को कॉल करने का परिणाम देता है जो win है।

मेरे कोड एक ही परिणाम पैदा करता है लेकिन समझना आसान है:

this.getWindow = function() { 
    return win; 
}; 

return win; 
+0

तो अगर मैं तुम्हें सही ढंग से समझ, एक 'प्रत्यक्ष' ग्रुप ए पर समारोह में एक ही नाम के साथ पिछले प्रोटोटाइप समारोह अधिलेखित कर देता है? – pimvdb

+1

@pimvdb नहीं - उदाहरण प्राप्त ऑब्जेक्ट में एक 'getWindow' विधि जोड़ दी गई है (जो ऊपर दिए गए कोड में 'a' है)। 'A.prototype.getWindow' विधि संशोधित नहीं है। हालांकि, 'a.getWindow' अब ** छाया ** ** एप्रोटोटाइप.जेटविंडो 'विधि है, ताकि यह प्रोटोटाइप विधि इंस्टेंस ऑब्जेक्ट' ए' के लिए पहुंच योग्य हो जाए। –

+0

मुझे 'वापसी' के अंत में '()' क्यों चाहिए? – theateist

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