2011-10-07 20 views
10

मैं अपनी जावास्क्रिप्ट को अलग-अलग फाइलों में विभाजित करके और प्रत्येक फ़ाइल को 'सब' नेमस्पेस देकर अधिक मॉड्यूलर बनाना चाहता हूं।जावास्क्रिप्ट नेमस्पेसिंग

subA.js

if(typeof ex == "undefined") { 
    var ex = {}; 
} 

ex.subA = function() { 
//all functions of subA here 
} 

और subB आदि

फिलहाल के लिए एक ही मेरे पास है 1 फ़ाइल, ex.js

var ex = (function() { 
    //private vars/funcs 
    return { 
     //public vars/funcs 
    } 
})(); 

यह मैं की तरह लग रहा मेरे अधिकांश कार्यों को subA.js और subB.js में ले जाना चाहिए, लेकिन शुरुआत में ex.js को शामिल करना चाहिए, subA.js और subB.js के साथ fterwards।

मेरे पास कई प्रश्न हैं।

  1. मुझे याद रखने में कठिनाई हो रही है कि मैंने प्रारंभिक नेमस्पेसिंग फ़ाइल कैसे बनाई, ex.js. ऐसा लगता है कि अज्ञात कार्य शुरू में सब कुछ निजी बनाने के लिए है, लेकिन मुझे याद नहीं है कि इसे ब्रांड्स में संलग्न क्यों किया जाना चाहिए और फिर अंत में (); के साथ सीधे निष्पादित किया गया।

  2. q1 से निम्नलिखित के बाद, क्या मेरी उप फाइलें ex.js के समान प्रारूप में होनी चाहिए, यानी, एनन फ़ंक्शन कोष्ठक में लपेटा गया है और सीधे निष्पादित किया गया है?

  3. ऐसा लगता है कि उप फ़ाइलों को केवल ex के सार्वजनिक कार्यों तक पहुंच होगी, क्या यह सच है? यदि ऐसा है, तो मैं अपनी उप फ़ाइलों को निजी कार्यों तक पहुंचने की अनुमति कैसे दे सकता हूं?

  4. मेरी HTML फ़ाइल, मेरे document.ready समारोह में (jQuery) में, मैं एक चर करने के लिए पूर्व initialising किया जाना चाहिए या मैं जा रहा

$(document).ready(function() { 
    ex.doSomething(); 
    ex.doSomethingElse(); 
}

है द्वारा व्यक्तिगत रूप से प्रत्येक कार्य कॉल कर सकते हैं दोनों के बीच एक अंतर है? मुझे लगता है कि जब ex.js शामिल किया जाता है, तो एक वैश्विक चर पूर्व को सीधे बनाया जाता है (अज्ञात फ़ंक्शन को तुरंत निष्पादित किया जाता है), इसलिए मुझे इसे दस्तावेज़ में फिर से परिभाषित करने की आवश्यकता नहीं है।

  1. अगर subA.js var ex = ex || {}; है कौन से किसी भी अलग में बयान बेहतर पहला है?

  2. क्या जेएस कोड शैली मानकों का उपयोग आप करते हैं?

यदि आप इन सबके माध्यम से पढ़ते हैं तो आप पहले से ही एक उत्थान, चीयर्स के लायक हैं।

+0

आप बेहतर रूप से अपनी 'टाइपोफ़' तुलना में उद्धरण जोड़ना चाहते हैं, और '! Ex': 'if (typeof ex ==" अपरिभाषित ") हटाएं। –

+0

@Rob W कुछ ब्राउज़रों को 'अपरिभाषित' के बजाय शून्य के रूप में पूर्व वापस नहीं करते हैं? याहू नाम अंतरण कोड का उपयोग करता है! पूर्व – Michael

+0

जब किसी चर को पहले कभी परिभाषित नहीं किया गया है, तो 'टाइपोफ़' '' अपरिभाषित 'होगा। हालांकि, कुछ गुण चेक करते समय 'शून्य' ('टाइपऑफ नल ===" ऑब्जेक्ट "') वापस कर सकते हैं। –

उत्तर

5

1. function(){ return{}} चर और कार्यों आप डॉन के लिए "गोपनीयता" जोड़ने के लिए एक बंद है अंदर यह रूप में जल्द ही लोड होगा कहीं और सुलभ नहीं होना चाहता लेकिन उस समारोह के दायरे में। फंक्शन (function(){}) फ़ंक्शन के चारों ओर कोष्ठक फ़ंक्शन अभिव्यक्ति बनाते हैं। उनका उपयोग किया जाता है, क्योंकि जब आप () पर किसी भी तर्क को पारित किए बिना function(){}() फ़ंक्शन निष्पादित करने का प्रयास करते हैं तो पार्सर शिकायत करेगा।

2. यदि आप subA या किसी भी अन्य विस्तारित ऑब्जेक्ट को अपने स्वयं के सबफंक्शन के लिए चाहते हैं, तो हाँ, आपको इसे इस तरह घोषित करना होगा, लेकिन न कि एक क्लैसर हालांकि।

आप क्या कर सकते हैं

ex.subA = function(x, y){ 
    return x+y; 
} 

जो var sum = ex.subA(2, 3);

कहा जा सकता है या फिर आप क्या कर सकते हैं

ex.subA = (function(){ 

    return { 
     add: function(x, y){ 
      return x+y; 
     }, 
     multiply: function(x, y){ 
      return x*y; 
     } 
    } 
})(); 

फिर फोन यह var sum = ex.subA.add(2, 3); var multiplication = ex.subA.multiply(2,3);

ऐसा करने के कई तरीके हैं।

3. हां, यह सच है। आप निजी कार्यों को सार्वजनिक कर सकते हैं। बंद करने से यह करने का कोई अन्य तरीका नहीं होगा।

4. यदि आप उपनाम करना चाहते हैं, तो आप इसे एक चर के लिए असाइन कर सकते हैं। हालांकि, इसकी कोई आवश्यकता नहीं है। यह ठीक तरह से काम करेगा जिस तरह से आप इसका वर्णन कर रहे हैं।

जावास्क्रिप्ट नेमस्पेसिंग में कुछ मौलिक सिद्धांतों और पैटर्न को समझने के लिए Essential JavaScript Namespacing Patterns पढ़ें।


पहले है अगर subA.js से वर पूर्व = पूर्व किसी भी अलग में बयान || {}; कौनसा अच्छा है?

सबसे पहले, यदि कथन if(typeof ex == 'undefined') होना चाहिए, typeof एक स्ट्रिंग देता है। यह जांचने की कोई आवश्यकता नहीं है कि ex गलत है या नहीं।

हां, यह अलग है। यदि कथन ex पहले से परिभाषित किया गया है तो यदि कथन कोई वैरिएबल असाइनमेंट नहीं करेगा। इसलिए, अगर कथन बेहतर है।

क्या जेएस कोड शैली मानकों का उपयोग आप करते हैं?

परियोजना के दायरे पर निर्भर करता है, लेकिन अधिकतर गहरी वस्तु एक सहायक समारोह के साथ विस्तार करती है।

+0

भयानक उत्तर के लिए धन्यवाद। मेरे पास कुछ अनुवर्ती प्रश्न हैं। 'If ​​(typeof ex == 'अपरिभाषित') के लिए, मैंने सुना है कि कुछ ब्राउज़र एक अपरिभाषित चर को 'अपरिभाषित' के रूप में वापस करते हैं लेकिन अन्य इसे शून्य के रूप में वापस करते हैं, यही कारण है कि इसमें 2 भाग हैं।
कोड शैली मानकों के साथ, मैं कार्यों के नामकरण के बारे में और बात कर रहा था, लेकिन मुझे इस गहरी वस्तु में दिलचस्पी है जिसमें सहायक कार्य शामिल है। क्या आप विस्तारित कर सकते हैं? क्या यह jQuery.extend की तरह कुछ है? आपको लगता है कि प्रत्येक के लिए के बजाय अतिरिक्त js फ़ाइलों अलग नामस्थान जोड़ने के लिए का उपयोग कर लगता होगा? – Michael

+0

@ माइकल 1) मुझे कभी ऐसा ब्राउज़र नहीं मिला है जो एक अपरिभाषित चर को शून्य करता है। हालांकि, मैं जावास्क्रिप्ट में काफी नया हूँ। हालांकि, मुझे लगता है कि आपने 'नूल' को ऑब्जेक्ट के रूप में माना जा रहा है, जो एक और बात है। यदि आप मुझे इसके लिए एक संदर्भ दे सकते हैं तो मुझे इसे पढ़ने में खुशी होगी। 2) हां, यह jQuery.extend की तरह कुछ है। मुझे लगता है कि यह सब परियोजना के आकार के लिए नीचे आता है। यदि आपके पास एक छोटी परियोजना है तो आप नामस्थानों को मैन्युअल रूप से जोड़ सकते हैं, जैसे आप हैं। यदि यह एक बड़ी परियोजना है तो आपको नामस्थान का विस्तार करने के लिए किसी प्रकार की सहायक की आवश्यकता है। – Shef

+0

मुझे लगता है कि आप सही हैं, मैंने इसे किसी और चीज़ से भ्रमित कर दिया होगा। – Michael

0

प्रश्न 1 और 3 के लिए:

ex.js में एक बंद शैली defenition अनुमति देगा उन सार्वजनिक समारोहों और वार्स/अवगत कराया।

मेरा विचार यह है कि, एनोमीस फ़ंक्शन से "पूर्व" को उन कार्यों और कार्यों के साथ वापस करने के लिए बेहतर है जिन्हें हमें बेनकाब करने की आवश्यकता है। Q12 के लिए

।लौटाए गए फ़ंक्शन में परिभाषित और उपयोग किए जाने वाले (निजी) चर अभी भी फ़ंक्शन के लिए उपलब्ध नहीं हैं और इन्हें उजागर किए गए फ़ंक्शन (बंद होने की संपत्ति) के माध्यम से उपयोग किया जा सकता है।

यदि बाह्य स्क्रिप्ट शामिल अनुभाग में या फ़ाइल के शीर्ष पर है, पूर्व document.ready से पहले उपलब्ध होना चाहिए और सीधे प्रयोग करने योग्य होना चाहिए।

तुम मुझे लगता है कि कर रहे हैं :) के रूप में मैं यह करने के लिए में आगे खुदाई के बाद अद्यतन करेगा। बहुत अच्छे सवाल :)

2

आप में डिजाइन, आप क्योंकि यह केवल एक वस्तु लौटने के लिए, निजी वार्स/funcs कि लैम्ब्डा समारोह में परिभाषित करने के लिए पहुँच नहीं जाएगा, या आप new उपयोग करना चाहते हैं?

1. () के बिना, ex एक फ़ंक्शन है जो ऑब्जेक्ट फ़ंक्शन देता है।

2. कोई आवश्यकता नहीं है, सिवाय इसके कि आप प्रारंभिकरण के लिए कुछ पैरामीटर पास करना चाहते हैं। जैसे

ex.my = (function(name) {var my_name = name;})('bar'); 

3. मुझे लगता है कि आप इस निजी विधि का मतलब है।

ex = (function() { 
    var foo = 'bar'; 
    return { 
     show: function() {alert(foo);} 
    } 
})(); 

उपरोक्त मामले में, केवल पूर्व foo तक पहुंच सकता है। सब कुछ तैयार हो

जरूरत 4.no, $(document).ready() कहा जाता है, अगर आप पहले से ex.js भरी हुई, आरंभीकरण किया जाता है।

सब कुछ के रूप में डोम भरी हुई है और इससे पहले कि पृष्ठ सामग्री लोड किए गए हैं

+0

@ 2 किस पैरामीटर को पारित करने की आवश्यकता होगी? @ 3 मैं निजी कार्यों का उपयोग कैसे करूं? @ 4 मुझे समझ में नहीं आता कि आपका क्या मतलब है – Michael

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