2008-08-16 33 views
13

मैं अक्सर सामना करना पड़ा साइटों किक्या जावास्क्रिप्ट में नेमस्पेसिंग करने का कोई "संक्षिप्त" तरीका है?

namespaces = { com : { example: { example.com's data} } 

लेकिन यह अन्य namespaced चौखटे के संबंध में सुरक्षित रूप से स्थापित करने लगता है की तर्ज पर एक "नाम स्थान" संरचना के भीतर अपने जावास्क्रिप्ट के सभी डाल की एक अपेक्षाकृत भारी राशि की आवश्यकता होती है कोड (> 2 लाइनों के रूप में परिभाषित)। मैं सोच रहा था कि क्या ऐसा करने के लिए कोई संक्षिप्त तरीका है? और क्या इसे संरचना करने के लिए अपेक्षाकृत मानक/सुसंगत तरीका है? जैसे। क्या "कॉम" नेमस्पेस सीधे वैश्विक वस्तु से जुड़ा हुआ है, या यह नामस्थान ऑब्जेक्ट के माध्यम से जुड़ा हुआ है?

[संपादित करें: व्हाउप्स, जाहिर है {com = { ... } } मेरे इरादे के करीब कुछ भी पूरा नहीं करेगा, शोग 9 को इंगित करने के लिए धन्यवाद। : D]

उत्तर

19

जावास्क्रिप्ट स्टैंड-अलोन नामस्थान जरूरत नहीं है। इसमें कार्य हैं, जो नामों और वस्तुओं को हल करने के लिए दायरा प्रदान कर सकते हैं, जो किसी दिए गए दायरे में नामित डेटा में योगदान दे सकते हैं।

यहाँ अपने उदाहरण, सही किया है:

var namespaces = { com: { example: { /* example.com's data */ } } } 

यह एक चर namespaces एक वस्तु शाब्दिक सौंपा जा रहा है। com, एक संपत्ति के साथ एक वस्तु: example, एक वस्तु जो संभवतः कुछ दिलचस्प होते हैं वस्तु एक संपत्ति में शामिल है।

तो, आप namespaces.com.example की तरह कुछ लिख सकते हैं। somePropertyOrFunctionOnExample और यह सब काम करेंगे। बेशक, यह भी हास्यास्पद है। आपके पास पदानुक्रमित नामस्थान नहीं है, आपके पास एक ऑब्जेक्ट है जिसमें ऑब्जेक्ट युक्त ऑब्जेक्ट है जिसमें आप वास्तव में परवाह करते हैं।

var com_example_data = { /* example.com's data */ }; 

यह बिंदुहीन पदानुक्रम के बिना भी काम करता है।

com_example = com_example || {}; 
com_example.flags = com_example.flags || { active: false, restricted: true}; 

com_example.ops = com_example.ops || (function() 
    { 
     var launchCodes = "38925491753824"; // hidden/private 
     return { 
     activate: function() { /* ... */ }, 
     destroyTheWorld: function() { /* ... */ } 
     }; 
    })(); 

... है जो, IMHO, यथोचित संक्षिप्त:

अब, यदि आप वास्तव में एक पदानुक्रम का निर्माण करना चाहते हैं, तो आप कुछ इस तरह की कोशिश कर सकते हैं।

+1

हालांकि, अब 'com_example' वैश्विक वस्तु का हिस्सा बनने जा रहा है। मान लें कि हम 'com_something_else',' com_etc' 'और कई ऑब्जेक्ट्स जोड़ते हैं, फिर भी हम वैश्विक ऑब्जेक्ट के रूट स्तर को प्रदूषित कर रहे हैं। क्या यह बेहतर नहीं होगा अगर हमारे पास वैश्विक में केवल एक 'कॉम' वस्तु थी जहां अन्य सभी वस्तुओं को जोड़ा गया था? साथ ही, हम किसी भी मौजूदा ऑब्जेक्ट को ओवरराइट नहीं करना चाहते हैं, यदि एकाधिक पुस्तकालयों का उपयोग किया जा रहा है तो क्या होगा। – Peter

+2

@ पीटर: यदि एकाधिक पुस्तकालय एक ही प्रतीक को परिभाषित करते हैं, तो आपको कोई समस्या नहीं होगी; यही कारण है कि jQuery जैसी लाइब्रेरी ऐसी चीजों तक पहुंच जाती है ताकि सबकुछ एक वैश्विक वस्तु में हो सके। मेरा मुद्दा यह नहीं था कि आपको * कई शीर्ष-स्तरीय ऑब्जेक्ट्स का उपयोग करना चाहिए, केवल गहरे-नेस्टेड ऑब्जेक्ट्स वाले नामस्थानों को फ़ेक करना आपको वास्तव में पागल-लंबे ऑब्जेक्ट नामों पर कुछ भी नहीं खरीदता है। अधिक व्यावहारिक विधि के लिए मेरा आखिरी उदाहरण देखें: एक वैश्विक नाम का उपयोग करें जो टकराव की संभावना नहीं है, और फिर एक ऐसी तकनीक जो कोड के अलग-अलग बिट्स को ऑब्जेक्ट जोड़ने की अनुमति देती है। – Shog9

3

YUI library पुस्तकालय कोड है जो एक समारोह है जो आप बेहतर मिल सकता है का उपयोग कर नेमस्पेसिंग हैंडल है। अन्य पुस्तकालय भी ऐसा कर सकते हैं।

12

यहाँ Javascript Namespacing पर पीटर Michaux द्वारा एक दिलचस्प लेख था। उन्होंने कहा कि जावास्क्रिप्ट नेमस्पेसिंग के 3 विभिन्न प्रकार की चर्चा:

  1. उपसर्ग नेमस्पेसिंग
  2. एकल वस्तु
  3. नेस्टेड वस्तु नेमस्पेसिंग

मैं plagiarize नहीं होगा कि वह क्या कहा लेकिन मुझे लगता है अपने लेख है नेमस्पेसिंग बहुत सूचनाप्रद।

पीटर अभी तक यह इंगित करने के लिए चला गया कि उनमें से कुछ के साथ प्रदर्शन विचार हैं।मुझे लगता है कि इस विषय पर विचार करना दिलचस्प होगा कि नई ईसीएमएस्क्रिप्ट हार्मनी योजनाओं ने नेमस्पेसिंग और पैकेजिंग के लिए 4.0 योजनाओं को छोड़ दिया है।

6

मैं वैश्विक दायरे में सबकुछ रखने के लिए एकमात्र मूल वस्तु को बनाने के याहू सम्मेलन का पालन करने का प्रयास करता हूं;

var FP = {}; 
FP.module = {}; 
FP.module.property = 'foo'; 
1

एक डॉट या एक अंडरस्कोर के लिए एक विकल्प के रूप में, आप डॉलर साइन चरित्र इस्तेमाल कर सकते हैं:

var namespaces$com$example = "data"; 
+0

यह क्या लाभ प्रदान करता है? – eyelidlessness

+0

इसे इस तरह से करके, आपको अपने नामस्थान को नेस्टेड आंतरिक वस्तुओं वाले ऑब्जेक्ट के रूप में परिभाषित करने की आवश्यकता नहीं है। आप बस नाम कहीं भी परिभाषित कर सकते हैं। –

+0

मुझे अभी भी डॉट या अंडरस्कोर के बजाय $ साइन का उपयोग करने का लाभ दिखाई नहीं देता है। मुझे लगता है कि $ संकेत शब्द को डॉट या अंडरस्कोर से पढ़ने के लिए कठिन बनाता है। –

5

सुनिश्चित करें कि आप किसी मौजूदा ऑब्जेक्ट के ऊपर लिख नहीं है बनाने के लिए, यदि आप ऐसा कुछ करना चाहिए:

if(!window.NameSpace) { 
    NameSpace = {}; 
} 

या

var NameSpace = window.NameSpace || {}; 

इस तरह आप नामस्थान ऑब्जेक्ट को ओवरराइट करने के बारे में चिंता किए बिना इसे अपने एप्लिकेशन/वेबसाइट में प्रत्येक फ़ाइल के शीर्ष पर डाल सकते हैं। साथ ही, यह आपको प्रत्येक फ़ाइल के लिए व्यक्तिगत रूप से इकाई परीक्षण लिखने में सक्षम बनाता है।

1

मैं भी इस (source) की तरह है:

(function() { 
    var a = 'Invisible outside of anonymous function'; 
    function invisibleOutside() { 
    } 

    function visibleOutside() { 
    } 
    window.visibleOutside = visibleOutside; 

    var html = '--INSIDE Anonymous--'; 
    html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside; 
    html += '<br/> typeof visibleOutside: ' + typeof visibleOutside; 
    contentDiv.innerHTML = html + '<br/><br/>'; 
})(); 

var html = '--OUTSIDE Anonymous--'; 
html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside; 
html += '<br/> typeof visibleOutside: ' + typeof visibleOutside; 
contentDiv.innerHTML += html + '<br/>';​ 
0

एक वस्तु शाब्दिक का उपयोग करें और या तो this वस्तु या स्पष्ट नाम करने के लिए स्थानीय चर जो समारोह में शामिल है के भाई गुणों के आधार पर नेमस्पेसिंग।उदाहरण के लिए:

var foo = { bar: function(){return this.name; }, name: "rodimus" } 
 
var baz = { bar: function(){return this.name; }, name: "optimus" } 
 

 
console.log(foo.bar()); 
 
console.log(baz.bar());

या स्पष्ट name संपत्ति के बिना:

var foo = { bar: function rodimus(){return this; } } 
 
var baz = { bar: function optimus(){return this; } } 
 

 
console.log(foo.bar.name); 
 
console.log(baz.bar.name);

या बिना this का उपयोग कर:

var foo = { bar: function rodimus(){return rodimus; } } 
 
var baz = { bar: function optimus(){return optimus; } } 
 

 
console.log(foo.bar.name); 
 
console.log(baz.bar.name);

चर और अन्य नामों का मुकाबला करने के नाम प्रॉपर्टी जोड़ने के लिए उपयोग RegExp या Object निर्माता काम करता है, तो एक hasOwnProperty परीक्षण का उपयोग जाँच करने के लिए:

var foo = RegExp(/bar/); 
 
    
 
/* Add property */ 
 
foo.name = "alpha"; 
 

 
document.body.innerHTML = String("<pre>" + ["name", "value", "namespace"] + "</pre>").replace(/,/g, "&#09;"); 
 

 
/* Check type */ 
 
if (foo.hasOwnProperty("name")) 
 
    { 
 
    document.body.innerHTML += String("<pre>" + ["foo", String(foo.exec(foo)), foo.name] + "</pre>").replace(/,/g, "&#09;"); 
 
    } 
 

 
/* Fallback to atomic value */ 
 
else 
 
    { 
 
    foo = "baz"; 
 
    } 
 

 
var counter = Object(1); 
 

 
/* Add property */ 
 
counter.name = "beta"; 
 

 
if (counter.hasOwnProperty("name")) 
 
    { 
 
    document.body.innerHTML += String("<pre>" + ["counter", Number(counter), counter.name] + "</pre>").replace(/,/g, "&#09;"); 
 
    } 
 
else 
 
    { 
 
    /* Fallback to atomic value */ 
 
    counter = 0; 
 
    }

डीओएम निम्नलिखित सम्मेलन का नाम एचटीएमएल नाम पर करता है और एसवीजी तत्व इंटरफ़ेस परिभाषाएँ:

  • HTMLTitleElement
  • SVGTitleElement
  • SVGScriptElement
  • HTMLScriptElement

जावास्क्रिप्ट कोर प्रोटोटाइप का उपयोग करता बहुरूपता का एक सरल फार्म के रूप में toString विधि नाम स्थान के लिए।

संदर्भ

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

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