2012-02-23 17 views
5

मैं सी # गणना-जैसी कार्यक्षमता को आजमाने और कार्यान्वित करने के लिए जावास्क्रिप्ट मॉड्यूल पैटर्न का उपयोग कर रहा हूं। मेरे पास दो तरीकों से है कि मैं वर्तमान में इस कार्यक्षमता को लागू करने के बारे में सोच रहा हूं लेकिन मुझे दूसरे के विपरीत एक ही तरीके से सभी लाभ या फायदे नहीं समझते हैं।जावास्क्रिप्ट मॉड्यूल पैटर्न मेमोरी पदचिह्न और प्रदर्शन

var MyApp = (function (app) { 

    // Private Variable 
    var enums = { 
     ActionStatus: { 
      New: 1, 
      Open: 2, 
      Closed: 3 
     } 
    }; 

    // Public Method 
    app.getEnum = function (path) { 
     var value = enums;    
     var properties = path.split('.'); 
     for (var i = 0, len = properties.length; i < len; ++i) { 
      value = value[properties[i]]; 
     } 
     return value; 
    }; 

    return app; 

})(MyApp || {}); 

// Example usage 
var status = MyApp.getEnum("ActionStatus.Open"); 

और अब कार्यान्वयन 2:

var MyApp = (function (app) { 

    // Public Property 
    app.Enums = { 
     ActionStatus: { 
      New: 1, 
      Open: 2, 
      Closed: 3 
     } 
    }; 

    return app; 

})(MyApp || {}); 

// Example usage 
var status = MyApp.Enums.ActionStatus.Open; 

मुख्य अंतर यह एक "सार्वजनिक" संपत्ति बनाम एक "निजी" चर का उपयोग कर enums स्टोर करने के लिए में है

यहाँ कार्यान्वयन 1 है। मुझे लगता है कि कार्यान्वयन 1 थोड़ा धीमा है लेकिन मुझे यकीन नहीं था कि enums को "निजी" के रूप में रखने से स्मृति उपयोग कम हो जाता है। क्या कोई मेमोरी पदचिह्न और दो (यदि कोई हो) के प्रदर्शन में अंतर को समझा सकता है? कोई अन्य सुझाव/सलाह की सराहना की जाती है।

उत्तर

4

... लेकिन मुझे यकीन है कि अगर के रूप में enums रखने "निजी" स्मृति उपयोग

विपरीत कम है, अगर कुछ भी नहीं था: आप अभी भी enums करना होगा वस्तु, और आपको इसे एक्सेस करने के लिए एक फ़ंक्शन होना चाहिए।

गति के मामले में, मैं इसके बारे में चिंता नहीं करता। जोड़ा गया फ़ंक्शन कॉल कोई नया अंतर नहीं बनायेगा (I looked into it जब नए forEach और इस तरह के आईई 6 पर भी बड़े पैमाने पर धीमी जेएस इंजन के साथ चिंतित है, तो इससे कोई फर्क नहीं पड़ता)।

कुछ साल में, आप शायद दोनों दुनिया का सबसे अच्छा है करने के लिए सक्षम हो जाएगा: Enums कि कर रहे हैं केवल पढ़ने के लिए, ECMAScript5 के Object.defineProperties सुविधा के लिए धन्यवाद:

var Enums = Object.defineProperties({}, { 
    ActionStatus: { 
     value: Object.defineProperties({}, { 
      New: {value: 1}, 
      Open: {value: 2}, 
      Closed: {value: 3} 
     }) 
    } 
}); 

// Usage 
var n = Enums.ActionStatus.New; // 1 

डिफ़ॉल्ट रूप से, के साथ बनाया गुण definePropertiesकेवल पढ़ने के लिए हैं।

असल में, यदि आप Object.defineProperties को उन ब्राउज़रों पर बनाने के लिए ES5 "शिम" जोड़ते हैं, जो अभी तक मूल रूप से नहीं हैं, तो आप मूल रूप से यह कर सकते हैं। "Shimmed" संस्करण रीड-राइट गुण बनाएगा, क्योंकि केवल मूल रूप से समर्थित संस्करण वास्तव में केवल-पढ़ने योग्य गुण बना सकता है, लेकिन अब आप कोड लिख सकते हैं और जानते हैं कि यह आधुनिक ब्राउज़र पर आपको पसंद आएगा (लगभग आधा वर्तमान में सभी वेब सर्फर्स में हैं) कम काम करने वाले लोगों पर, कम मजबूती के साथ, अभी भी काम कर रहे हैं।

और निश्चित रूप से, EMCAScript6 चीजें आगे ले सकता है, लेकिन यह अभी भी एक भविष्य की बात है।

+0

उत्तर देने के लिए समय और ES5 जानकारी के लिए धन्यवाद। क्या आप ब्राउजर मेमोरी मैनेजमेंट के संदर्भ में जानते हैं कि कैसे कार्यान्वयन 1 अपनी निजी संपत्ति बनाम कार्यान्वयन 2 की सार्वजनिक संपत्ति का भंडारण करता है? मैंने मेमोरी खपत को प्रोफाइल करने की कोशिश की लेकिन मुझे पता चला कि कार्यान्वयन 2 ने MyApp के ऑब्जेक्ट आकार को बड़ा बना दिया था जबकि कार्यान्वयन 1 नहीं था। लेकिन मुझे पता है कि कार्यान्वयन 1 को कहीं भी निजी चर के संदर्भ को स्टोर करना है। –

+0

@steve_ut: यह ऑब्जेक्ट बनाने के लिए उपयोग किए जा रहे अज्ञात फ़ंक्शन को कॉल के * निष्पादन संदर्भ * के * परिवर्तनीय बाध्यकारी ऑब्जेक्ट * नामक कुछ (गहरी सांस) में संग्रहीत किया जाता है। * (whew) * :-) यह है [ES5 spec] (http://es5.github.com) शब्दावली ([कैनोलिक लिंक] (http://www.ecma-international.org/publications/standards/Ecma- 262.htm))। किसी फ़ंक्शन में प्रत्येक कॉल को एक परिवर्तनीय बाध्यकारी ऑब्जेक्ट मिलता है, जिसमें फ़ंक्शन, इसके स्थानीय वर्र्स और गुणों के रूप में कुछ अन्य चीजें हैं।पुरानी शब्दावली के साथ विवरण * [बंद जटिल नहीं हैं] (http://goo.gl/OzIQY) *। –

+0

@steve_ut: या वास्तव में, अधिक सही होने के लिए, यह सामान्य मेमोरी पूल में संग्रहीत है और परिवर्तनीय बाध्यकारी ऑब्जेक्ट का संदर्भ है। यह आपके 'MyApp' ऑब्जेक्ट को देखने का भी सही तरीका है; 'MyApp' के आकार को मैप करने के लिए आप जो भी टूल उपयोग कर रहे हैं वह आपको कुछ सरल जानकारी दे रहा है। जावास्क्रिप्ट एक दूसरे के संदर्भ के साथ मेमोरी पूल में ऑब्जेक्ट्स के बारे में है। क्रियान्वयन 2 से 'MyApp' ऑब्जेक्ट वास्तव में * एप * एन्म्स' द्वारा संदर्भित ऑब्जेक्ट को कार्यान्वयन 1 से अधिक नहीं करता है। –

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