2011-02-02 13 views
62

मेरे पास अपनी जावास्क्रिप्ट फ़ाइल में लागू प्रत्येक जावास्क्रिप्ट "कक्षाएं" हैं। विकास उन फ़ाइलों को व्यक्तिगत रूप से लोड किए गए हैं, और उत्पादन के लिए वे concatenated रहे हैं, लेकिन दोनों ही मामलों में मैं स्वयं एक लोडिंग आदेश परिभाषित करने के लिए है, यकीन है कि अगर बी ए का उपयोग करता है मैं के एक कार्यान्वयन के रूप में RequireJS उपयोग करने के लिए योजना बना रहा हूँ कि बी ए के बाद आता है बनाने के लिए CommonJS Modules/AsynchronousDefinition स्वचालित रूप से मेरे लिए इस समस्या को हल करने के लिए।RequJS: मॉड्यूल को परिभाषित करने के लिए जिसमें एक "वर्ग" है?

क्या मॉड्यूल को परिभाषित करने के लिए ऐसा करने का एक बेहतर तरीका है कि प्रत्येक एक वर्ग को निर्यात करता है? यदि नहीं, तो आप मॉड्यूल के निर्यात का नाम कैसे लेंगे? एक मॉड्यूल "कर्मचारी" एक वर्ग "कर्मचारी" निर्यात करता है, जैसा कि नीचे दिए गए उदाहरण में है, मुझे DRY महसूस नहीं होता है।

define("employee", ["exports"], function(exports) { 
    exports.Employee = function(first, last) { 
     this.first = first; 
     this.last = last; 
    }; 
}); 

define("main", ["employee"], function (employee) { 
    var john = new employee.Employee("John", "Smith"); 
}); 

उत्तर

108

AMD proposal तुम सिर्फ निर्यात वस्तु के लिए एक मूल्य के वापस जाने के लिए अनुमति देता है। लेकिन ध्यान दें कि एएमडी प्रस्ताव की एक विशेषता है, यह सिर्फ एक एपीआई प्रस्ताव है, और मॉड्यूल को नियमित कॉमनजेएस मॉड्यूल में अनुवाद करना कठिन बना देगा। मुझे लगता है कि यह ठीक है, लेकिन जानने के लिए उपयोगी जानकारी।

मैं मॉड्यूल है कि एक निर्माता समारोह एक अपर-केस नाम के साथ शुरू करने के लिए निर्यात को पसंद करते हैं, तो इस मॉड्यूल के गैर-अनुकूलित संस्करण भी Employee.js

में होगा:

तो आप निम्न कर सकते

define("Employee", function() { 
    //You can name this function here, 
    //which can help in debuggers but 
    //has no impact on the module name. 
    return function Employee(first, last) { 
     this.first = first; 
     this.last = last; 
    }; 
}); 

अब एक और मॉड्यूल में, तुम इतनी तरह कर्मचारी मॉड्यूल का उपयोग कर सकते हैं:

define("main", ["Employee"], function (Employee) { 
    var john = new Employee("John", "Smith"); 
}); 
+0

वाह, सीधे @jrburke से एक जवाब, श्री। खुद जेएस की आवश्यकता है! +1! – Bart

98

jrburke के जवाब देने के लिए एक अतिरिक्त के रूप में, ध्यान दें कि आप ग वापस जाने के लिए नहीं है सीधे कार्यकर्ता कार्य। सबसे अधिक उपयोगी कक्षाओं के लिए आप भी प्रोटोटाइप है, जो आपको इस तरह से कर सकते हैं के माध्यम से तरीकों में जोड़ना चाहेंगे:

define('Employee', function() { 
    // Start with the constructor 
    function Employee(firstName, lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    // Now add methods 
    Employee.prototype.fullName = function() { 
     return this.firstName + ' ' + this.lastName; 
    }; 

    // etc. 

    // And now return the constructor function 
    return Employee; 
}); 

वास्तव में यह वास्तव में पैटर्न this example at requirejs.org में दिखाया गया है।

+1

हाय मार्क, आपकी पोस्ट ठीक वही है जो मैं ढूंढ रहा हूं। एक चीज़ को छोड़कर। क्या कर्मचारी ऑब्जेक्ट के लिए कुछ फ़ील्ड को परिभाषित करना संभव है जो कि कन्स्ट्रक्टर का हिस्सा नहीं हैं? उदाहरण के लिए स्थिति संपत्ति और विधि स्थिति टॉपर है, लेकिन किसी भी तरह से उस गुण को परिभाषित नहीं किया गया है जो कि कर्मचारी = नया कर्मचारी ('जॉन', 'स्मिथ') में नहीं है; कर्मचारी.position = 'प्रबंधक'; अलर्ट (कर्मचारी.positionToUpper()); –

+4

एलेक्स, यह उदाहरण मेरे लिए उपयोगी था, यह बहुत अच्छी तरह से प्रलेखित है और शायद आपके द्वारा देखे जाने वाले उदाहरण प्रदान कर सकते हैं: https://gist.github.com/jonnyreeves/2474026 –

+0

@NathanPrather यह एक महान संदर्भ है - टिप्पणियों ने अनुवाद करने में मदद की मुझे जावा पृष्ठभूमि से – y3sh

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