2012-06-10 10 views
9

मैंने पढ़ा है कि जावास्क्रिप्ट परियोजनाओं के लिए नामस्थान बनाने से अन्य पुस्तकालयों के साथ संघर्ष को कम करने में मदद मिलती है। मेरे पास कई प्रकार के ऑब्जेक्ट्स के साथ कुछ कोड है जिसके लिए मैंने कन्स्ट्रक्टर फ़ंक्शंस को परिभाषित किया है। क्या इन्हें नेमस्पेस के अंदर भी रखना अच्छा अभ्यास है?नामस्थान के अंदर

उदाहरण के लिए:

var shapes = { 
    Rectangle: function(w, h) { 
     this.width = w; 
     this.height = h; 
    } 
}; 

के माध्यम से कहा जा सकता है:

var square = new shapes.Rectangle(10,10); 
+3

मुझे लगता है कि एक अच्छा विचार –

+0

आपका निर्माता, एक समारोह है जो है, * फ़ंक्शन घोषणा * के बजाय * फ़ंक्शन एक्सप्रेशन * बन जाता है * यदि आप इसे 'फ़ंक्शन आयत (डब्ल्यू, एच) {} 'लिखने के बजाय" नेमस्पेस "में ऑब्जेक्ट प्रॉपर्टी में असाइन करते हैं। इसमें थोड़ा अंतर है: https: //developer.mozilla।संगठन/डी/डॉक्स/वेब/जावास्क्रिप्ट/संदर्भ/कार्य इसके अलावा, यह वैश्विक नामस्थान को प्रदूषित नहीं करता है, जो एक अच्छी बात है, जैसा कि अन्य ने इंगित किया है। – caw

उत्तर

4

इस नेमस्पेसिंग को "Singleton pattern" कहा जाता है और यह प्रसिद्ध पैटर्न "Gang of Four" डिज़ाइन पैटर्न पुस्तक द्वारा प्राप्त मुख्य पैटर्न में से एक है।

महान (और मुक्त) पुस्तक Learning JavaScript Design Patterns से:

शास्त्रीय आधार पर, सिंगलटन पैटर्न एक विधि उस वर्ग का एक नया उदाहरण बनाता है के साथ एक वर्ग बनाने अगर एक नहीं है द्वारा लागू किया जा सकता मौजूद। एक उदाहरण पहले से मौजूद होने की स्थिति में, यह केवल उस ऑब्जेक्ट का संदर्भ देता है। इस प्रकार सिंगलटन पैटर्न को ज्ञात किया जाता है क्योंकि यह किसी ऑब्जेक्ट को कक्षा के तत्कालता को प्रतिबंधित करता है।

जावास्क्रिप्ट में, सिंगलेट्स नामस्थान प्रदाता के रूप में कार्य करता है जो वैश्विक नामस्थान से कार्यान्वयन कोड को अलग करता है ताकि कार्यों के लिए एकल बिंदु पहुंच प्रदान किया जा सके।

वे अलग अलग रूपों के एक नंबर पर ले जा सकते हैं, लेकिन इसकी सबसे बुनियादी में, एक सिंगलटन एक वस्तु शाब्दिक एक साथ समूहीकृत इससे संबंधित कार्यों और गुणों के साथ के रूप में लागू किया जा सकता ...

तो हाँ , यह कई प्रोग्रामिंग भाषाओं में एक अच्छी तरह से प्रयुक्त अवधारणा है और जावास्क्रिप्ट में वैश्विक नेमस्पेस ऑब्जेक्ट टकराव को रोकने के लिए एक महान है।

यह भी देखें: Simplest/Cleanest way to implement singleton in JavaScript?

+1

ग्रेट। बहुत बहुत धन्यवाद। लिंक के लिए भी धन्यवाद। मैंने किसी नामस्थान में किसी फ़ंक्शन के लिए 'new' को कॉल करने वाले किसी भी व्यक्ति के किसी भी उदाहरण को नहीं देखा था और आश्चर्य हुआ कि उसके लिए कोई कारण है या नहीं। – Joe

+0

कोई कारण नहीं है कि मैं सोच सकता हूं। नया कार्य जावास्क्रिप्ट की प्रोटोटाइपिकल विरासत है, जिसे अक्सर अभ्यास में प्रयोग किया जाता है जैसे कि कक्षा की तरह विरासत। आपके द्वारा देखे जाने वाले अधिकांश उदाहरण केवल एक "कक्षा" को परिभाषित करते हैं, लेकिन यदि आप उनमें से एक समूह को व्यवस्थित करने का प्रयास कर रहे हैं तो सिंगलटन पैटर्न समान रूप से अधिक उपयोगी नहीं है। – buley

+2

@ ज़ो बेशक, यह सिंगलटन पैटर्न नहीं माना जाता है यदि ऑब्जेक्ट शाब्दिक में रचनाकार होते हैं ;-) –

2

हां। आपको वैश्विक नामस्थान को कम से कम संभव

2

हाँ, यह एक अच्छा विचार है, क्योंकि आप परेशानी और भ्रामक ग्लोबल नेमस्पेस को दूषित की वजह से बचें। हालांकि मैं व्यक्तिगत रूप से shapes को shape में बदल दूंगा, इसलिए आपके पास shape.Rectangle हो सकता है, जो मुझे थोड़ा और समझ में आता है (आखिरकार, एक आयताकार केवल एक वस्तु है)।

1

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

function doSomethingTo(shape) { 
    var shapeName, validArg; 

    for (shapeName in shapes) { 
    validArg = validArg || shape instanceof shapes[shapeName]; 
    } 

    if (!validArg) throw "Argument is not a shape."; 
} 
5

यह आम तौर पर एक अच्छा विचार है; इसके अलावा, अपने साझा किए गए ऑब्जेक्ट कार्यों का एक सेट उजागर नहीं किया जाना चाहिए कि आप उन सभी को बंद करने के अंदर लपेट कर सकते हैं, एक मॉड्यूल की तरह की आवश्यकता होती है:

var shapes = (function() { 
    // private variables 
    var foo = 0; 

    // private function 
    function get_area(w, h) 
    { 
    return w * h; 
    } 

    return { 
    Rectangle: function(w, h) { 
     this.width = w; 
     this.height = h; 
     // call private function to determine area (contrived example) 
     this.area = get_area(w, h); 
    } 
    } 
}()); 

var s = new shapes.Rectangle(100, 5);