2011-05-24 27 views
14

कॉफ़ीस्क्रिप्ट में खोदना मैं अपनी जावास्क्रिप्ट फ़ाइलों को कॉफ़ीस्क्रिप्ट में बंद करने की कोशिश कर रहा हूं।छिपे हुए चर के साथ कॉफ़ीस्क्रिप्ट में मॉड्यूल पैटर्न

इस संबंध में, मैं

इसलिए मेरे सवाल है Doulgas Crockford की मॉड्यूल पैटर्न (बंद आदेश चर "निजी" रखने के लिए बंधन) से संबंधित एक सवाल है: क्या होगा aquivalent निम्नलिखित जे एस देखने के लिए Coffeescript जैसे:

var test = function() { var hidden = 'open'; return { open: hidden }; }(); 

सम्मानपूर्वक, क्या कॉफ़ीस्क्रिप्ट में इस पैटर्न के लिए एक अलग/बेहतर अपमान है?

उत्तर

5

कॉफीस्क्रिप्ट (या बल्कि, coffee स्क्रिप्ट) स्वचालित रूप से एक अज्ञात फ़ंक्शन के भीतर आपके कोड को लपेटता है जब तक कि आप इसे न कहें।

यदि आपको उस अज्ञात बंदरगाह से वस्तुओं को प्रकाशित करने की आवश्यकता है, तो आप स्पष्ट रूप से उन्हें मूल वस्तु को असाइन कर सकते हैं; कुछ पॉइंटर्स के लिए Underscore.coffee की शुरुआत देखें।

http://jashkenas.github.com/coffee-script/documentation/docs/underscore.html

17

मुझे लगता है कि सबसे अच्छा तरीका (देखने के छोरों मेरी PragPub article जो मुख्य रूप से मौजूद है मान कैप्चर करना) का शाब्दिक do कीवर्ड की मदद से, CoffeeScript में अपने उदाहरण अनुवाद करने के लिए है:

test = do -> 
    hidden = 'open' 
    open: hidden 

यह

var test; 
test = (function() { 
    var hidden; 
    hidden = 'open'; 
    return { 
    open: hidden 
    }; 
})(); 

जो अन्य की तुलना में अपने कोड के समान है करने के लिए संकलित स्वरूपण। (कॉफीस्क्रिप्ट कंपाइलर स्वचालित रूप से अपने दायरे के शीर्ष पर सभी var घोषणाएं डालता है, जो यह निर्धारित करना आसान बनाता है कि जावास्क्रिप्ट आउटपुट को देखकर एक चर को कैसे स्कॉप्ड किया जाता है।)

+0

"जो मुख्य रूप से लूप में मूल्यों को पकड़ने के लिए मौजूद है" <असहमत। 'डू' का वह विशेष व्यवहार तर्कसंगत रूप से सबसे असंगत/भ्रमित सुविधाओं में से एक है। – matyr

+0

Matyr, क्या आप इसे समझा सकते हैं? ऐसा कीवर्ड दिखता है जैसे यह मेरे लिए स्थानीय दायरे में मूल्यों को कैप्चर करता है। – Geoff

+0

@matyr जब आपने शुरुआत में इसे प्रस्तावित किया था तो यह 'do' का उद्देश्य नहीं था, लेकिन निश्चित रूप से यही कारण है कि जेरेमी (अनिच्छा से) ने इसे कॉफीस्क्रिप्ट में जोड़ा। [समस्या 9 5 9] देखें (https://github.com/jashkenas/coffee-script/issues/959)। यह एकमात्र संदर्भ भी है जिसमें 'आधिकारिक दस्तावेज़] (http://jashkenas.github.com/coffee-script/#loops) में 'do' दिखाई देता है। –

6

मैंने कॉफ़ीस्क्रिप्ट विकी में एक अनुभाग जोड़ा, नेमस्पेसिंग संभाल लें। यह बहुत elegent (मुझे लगता है कि)

https://github.com/jashkenas/coffee-script/wiki/Easy-modules-with-coffeescript

Coffeescript एक गुमनाम समारोह में सभी स्रोत कोड फ़ाइलों को संलग्न की है कि इसके बाद के संस्करण एक देशी मॉड्यूल व्यवस्था नहीं है है। हालांकि थोड़ी सी सरल चालबाजी के साथ आप मॉड्यूल कर सकते हैं जो रूबी की ईर्ष्या हैं। मैं तरह मेरे मॉड्यूल को परिभाषित नीचे

@module "foo", -> 
    @module "bar", -> 
     class @Amazing 
      toString: "ain't it" 

मॉड्यूल सहायक के कार्यान्वयन

window.module = (name, fn)-> 
    if not @[name]? 
    this[name] = {} 
    if not @[name].module? 
    @[name].module = window.module 
    fn.apply(this[name], []) 

जो आप किसी अन्य स्रोत फ़ाइल में डाल दिया है, तो आप की तरह कर सकते हैं। इसके बाद आप अपने विशिष्ट प्रश्न के

x = new foo.bar.Amazing 

wrt namespaced मॉड्यूल से अपनी कक्षाओं का उपयोग कर सकते मुझे लगता है कि नीचे चमेली कल्पना मेरी मॉड्यूल प्रणाली

@module "test", -> 
    hidden = 10 
    @open = hidden 

describe "test", -> 
    it "has no hidden", -> 
    expect(test.hidden?).toEqual false 

    it "has open", -> 
    expect(test.open?).toEqual true 
+1

वह विकी पृष्ठ (https://github.com/jashkenas/coffee-script/wiki/Easy-modules-with-coffeescript) मौजूद प्रतीत नहीं होता है। –

1

का उपयोग कर इसका जवाब आप एक ही में अपने मॉड्यूल लिख सकते हैं कक्षा, फिर -b विकल्प के साथ कॉफ़ीस्क्रिप्ट संकलित करना स्वाभाविक रूप से उस मॉड्यूल पैटर्न को बनाएगा जिसे आप ढूंढ रहे हैं।

यह:

class test 
    hidden = 'open' 
    open: hidden 

यह करने के लिए संकलित:

var test; 
test = (function() { 
    var hidden; 
    hidden = 'open'; 

    test.prototype.open = hidden; 

    return test; 
})(); 

जो बहुत लगभग आप क्या देख रहे थे है।

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