2011-05-17 17 views
5

मैं निम्नलिखित जावास्क्रिप्ट है:जावास्क्रिप्ट ऑब्जेक्ट निर्माण सबसे अच्छा अभ्यास

  var MyObject = (function() { 

       function Setup(args) { 
        this.prop1 = args.x; 
        this.prop2 = args.y 
        this.prop3 = this.prop1 + this.prop2; 

        this.Create = function() { 
         return 'a' + helperFunc(); 
        } 

        function helperFunc() { 
         return this.prop3; 
        } 
       } 

       return { 
        init : function(args) { 
         var setup = new Setup(args); 

         setup.Create(); 
        } 
       } 

      })(); 


      $(function() { 

       MyObject.init(someArgs); 

      }); 
  1. मेरे दृष्टिकोण निर्माण एक अच्छा अभ्यास आपत्ति है?

  2. this.prop3 तक पहुंचने का प्रयास करते समय मुझे हेल्परफनक में undefined मिल रहा है।

  3. मैं भी एक स्थानीय चर के लिए this.prop1 + this.prop2 आवंटित करते हैं और समारोह उपयोग करती हैं इसलिए इस तरह मान देने के लिए करने की कोशिश की:

     function Setup(args) { 
           var total; 
    
           this.prop1 = args.x; 
           this.prop2 = args.y 
    
           total = this.prop1 + this.prop2; 
           this.getTotal = function() { 
             return total; 
           }; 
    
           this.prop3 = this.prop1 + this.prop2; 
           ... 
    

... और जब इस तरह helperFunc में इस बुला:

     return this.getTotal(); 

.. मैं this.getTotal एक समारोह मिलता है नहीं

मैं ऑब्जेक्ट सृजन के आसपास पढ़ रहा हूं और निजी सदस्यों की नकल करने के लिए बंदियों का उपयोग कर रहा हूं और इसलिए वस्तुओं को परिभाषित करने का कोई भी तरीका नहीं है, मैं उलझन में हूं।

TBH - मैं वास्तव में निर्माण समझ में नहीं आता:

     var myObject = (function() { ... }(); 

मैंने देखा है यह jQuery प्लगइन्स में एक बहुत उपयोग किया जाता है लेकिन क्या पहले parenth अंत में खाली parenth के बाद क्या अर्थ है और क्यों है?

प्रदान किए गए किसी भी ज्ञान की सराहना की जाएगी।

इसके अलावा, मैं आदेश पर डगलस Crockford पुस्तक जावास्क्रिप्ट पर है और जब तक यह आता है मैं इस समस्या

+1

http://stackoverflow.com/questions/3921922/what-does-this-mean-function-x-y-a-b-in-javascript – mplungjan

+0

यहां बहुत सारे प्रश्न हैं। यदि आप प्रति प्रश्न एक प्रश्न पर खुद को सीमित करने का प्रयास करते हैं तो यह सटीक और सटीक उत्तर प्रदान करना बहुत आसान होगा। –

+0

mplungjan - यह फ़ंक्शन कॉल के अंत में अभिभावक को समझने का एक आदर्श लिंक है। मुझे बस यह समझने की जरूरत है कि एक संपत्ति को कॉल करते समय मुझे अपरिभाषित क्यों हो रहा है और फ़ंक्शन को कॉल करते समय फ़ंक्शन नहीं ... –

उत्तर

4

का हवाला देते हैं करने के लिए Xhalent's wonderful article (वास्तव में अच्छी तरह से किया है और स्पष्ट रूप wirtten) का उल्लेख उसके द्वारा:

है ऐसा इसलिए है क्योंकि का मूल्य "इस" की "इस" जब वस्तु बनाया गया था मूल्य के लिए अलग है ।

तो अपने मामले में

:

... 
    var _this = this.prop3; 
    function helperFunc() { 
    return _this; 
    } 
... 

को प्राप्त हो सकता है क्या वांछित है।

+0

यह उत्तर है कि मैं अपरिभाषित क्यों हो रहा हूं। काश मैं पॉल बुशर्स को भी जवाब दे सकता हूं क्योंकि इससे समस्या को समझने में मदद मिलती है। मैंने Xhalent के लेख पढ़े हैं और वे बहुत उपयोगी हैं। मूल्य को एक निजी चर में सेट करना मुझे अनजान था कि मैं इसे हेल्परफनक फ़ंक्शन से एक्सेस कर सकता था। मैंने सी # पर बहुत अधिक समय बिताया है और क्लासिक ओप सोचने से रोकने की जरूरत है। डगलस क्रॉकफोर्ड की पुस्तक के लिए तत्पर हैं। उत्तर देने वाले हर किसी का धन्यवाद .... –

0

आप एक अच्छा ट्यूटोरियल this page पर जे एस में OOP पर माइक कोस द्वारा राशि का समाधान करने की कोशिश की जरूरत है।

मैंने देखा है यह jQuery में प्लगइन्स एक बहुत थे, लेकिन क्या पहले parenth अंत में खाली parenth के बाद क्या अर्थ है और क्यों है?

अभिभावक का दूसरा सेट तत्काल उस कार्य को आमंत्रित करता है जिसे आपने माता-पिता के पहले सेट में घोषित किया है।

var myFunction = function() { alert("boo"); }; // Declare & instanciate 
myFunction(); // Invoke 
myFunction(); // Invoke again 

या एक पंक्ति में दोनों कार्य करें::

आप इसे घोषित करने और इसे separatly पर अमल कर सकता है (कई बार निष्पादित करने के लिए अनुमति देता है)

(function() { alert("boo"); })(); // Can only invoke now, the function is anonymous and not stored anywhere. 
1

मैं बुनियादी जावास्क्रिप्ट पर एक श्रृंखला किया है बुनियादी बातों - वस्तुओं और प्रोटोटाइप यहाँ कवर कर रहे हैं:

Javascript Object Instantation and Prototypes

मैं यहां क्लोजर में पहुंचा हूं: Javascript Closures

आशा है कि वे मदद करें। चीयर्स।

+1

आपकी वेबसाइट क्षैतिज स्क्रॉलबार के लोड के साथ अपठनीय है – woens

1

यदि आपके पास कोई ऐसा कार्य है जो this का उपयोग करता है, तो आपको यह सुनिश्चित करना होगा कि कॉलिंग संदर्भ सही है। यानी this.helperFunc() का उपयोग करें, न केवल helperFunc() (लेकिन आपको चीजों को सेट करने की भी आवश्यकता होगी ताकि यह .helperFunc परिभाषित किया गया हो)। आपके उदाहरण में हेल्परफनक के अंदर this का संदर्भ Create() जैसा नहीं है।

आप इसके बारे में सोच सकते हैं जैसे कि कार्यों वस्तुओं के सदस्यों के रूप में परिभाषित नहीं हैं, लेकिन वस्तुओं के सदस्यों के रूप कहा जाता है।

तीन चीजें हैं जो this संदर्भ के आधार पर हल हो सकती हैं।

  1. एक नया निर्मित ऑब्जेक्ट, यदि फ़ंक्शन कॉल new कीवर्ड से पहले था।
  2. फ़ंक्शन कहलाते समय डॉट के बाईं ओर ऑब्जेक्ट।
  3. वैश्विक वस्तु (window), यदि उपरोक्त में से कोई भी प्रदान नहीं किया गया है।

एक समारोह एक वस्तु के बिना कहा जाता है, तो this.Create में helperFunc करने के लिए अपने कॉल के मामले में, this वैश्विक वस्तु (window, जब एक ब्राउज़र में प्रयुक्त)

को देखते हुए कुछ करने के लिए बाध्य किया जाएगा इस तरह:

var o = {someVal:"hello"}; 
o.doSomething = function(){alert(this.someVal)}; 

कॉलिंग o.doSomething() होगा स्पष्ट रूप से चेतावनी "हैलो"।

को देखते हुए:

var o2 = {someVal:"world"}; 
o2.someFunc = o.doSomething; 

कॉलिंग o2.someFunc() "दुनिया" सूचित करेंगे, नहीं "हैलो", जैसा कि आप अगर यह o की doSomething सदस्य के लिए एक सूचक थे उम्मीद करेंगे।

और दिया:

var someFunc = o.doSomething 
someVal = "sailor" 

someFunc() कॉलिंग "नाविक" सूचित करेंगे।

भ्रम का एक और बिंदु this का उपयोग सीधे Setup() के भीतर किया जाता है। जब आप new का उपयोग करके फ़ंक्शन को कॉल करते हैं, जैसा आपने किया है, this वैश्विक ऑब्जेक्ट से बाध्य नहीं है, लेकिन Setup ऑब्जेक्ट के नए उदाहरण के लिए है।

ऊपर दिए गए मेरे उदाहरण के लिए, इसका मतलब है कि new o.doSomething() पर कॉल करना "अपरिभाषित" होगा, क्योंकि कॉल के लिए बनाई गई नई ऑब्जेक्ट में "कुछवल" सदस्य नहीं है।

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