प्रोटोटाइप एक अनुकूलन हैं।
उनका उपयोग करने का एक अच्छा उदाहरण jQuery लाइब्रेरी है। हर बार जब आप $('.someClass')
का उपयोग करके एक jQuery ऑब्जेक्ट प्राप्त करते हैं, तो उस ऑब्जेक्ट में दर्जनों "विधियां" होती हैं। पुस्तकालय है कि प्राप्त कर सकते थे एक वस्तु लौटाएँ:
return {
show: function() { ... },
hide: function() { ... },
css: function() { ... },
animate: function() { ... },
// etc...
};
लेकिन मतलब यह होगा कि कि स्मृति में हर jQuery वस्तु नामित स्लॉट, एक ही तरीके से युक्त अधिक से अधिक के दर्जनों होगा।
इसके बजाय, उन विधियों को प्रोटोटाइप पर परिभाषित किया गया है और सभी jQuery ऑब्जेक्ट्स प्रोटोटाइप "उत्तराधिकारी" हैं ताकि वे सभी विधियों को बहुत कम रनटाइम लागत पर प्राप्त कर सकें।
jQuery को यह सही तरीके से प्राप्त करने का एक महत्वपूर्ण हिस्सा यह है कि यह प्रोग्रामर से छिपा हुआ है। इसका पूरी तरह से अनुकूलन का इलाज किया जाता है, न कि लाइब्रेरी का उपयोग करते समय आपको चिंता करने की ज़रूरत है।
जावास्क्रिप्ट के साथ समस्या यह है कि नग्न रचनाकार कार्यों को कॉलर को new
के साथ उपसर्ग करने के लिए याद रखने की आवश्यकता होती है या अन्यथा वे आमतौर पर काम नहीं करते हैं। इसके लिए कोई अच्छा कारण नहीं है। jQuery को सामान्य कार्य के पीछे उस बकवास को छिपाकर सही हो जाता है, $
, इसलिए आपको यह ध्यान रखना नहीं है कि ऑब्जेक्ट्स कैसे कार्यान्वित किए जाते हैं।
ताकि आप आसानी से निर्दिष्ट प्रोटोटाइप के साथ ऑब्जेक्ट बना सकें, ईसीएमएस्क्रिप्ट 5 में मानक फ़ंक्शन Object.create
शामिल है। इसके बारे में एक बहुत सरलीकृत संस्करण इस प्रकार दिखाई देगा:
Object.create = function(prototype) {
var Type = function() {};
Type.prototype = prototype;
return new Type();
};
यह सिर्फ एक निर्माता समारोह लेखन और फिर new
के साथ बुलाने की दर्द का ख्याल रखता है।
आप प्रोटोटाइप से बचेंगे?
उपयोगी तुलना ओओ भाषाओं जैसे जावा और सी # के साथ उपयोगी तुलना है।
- इंटरफ़ेस विरासत है, जहां आप
implement
एक interface
ऐसा है कि वर्ग इंटरफ़ेस के हर सदस्य के लिए अपनी अनूठी कार्यान्वयन प्रदान करता है: ये विरासत के दो प्रकार का समर्थन है।
- कार्यान्वयन विरासत है, जहां आप
extend
एक class
कि कुछ तरीकों के डिफ़ॉल्ट कार्यान्वयन प्रदान करता है।
जावास्क्रिप्ट में, प्रोटोटाइपिकल विरासत कार्यान्वयन विरासत का एक प्रकार है। तो उन परिस्थितियों में जहां (सी # या जावा में) आप मूल वर्ग प्राप्त करने के लिए बेस क्लास से व्युत्पन्न होते, जिसे आप ओवरराइड के माध्यम से छोटे बदलाव करते हैं, फिर जावास्क्रिप्ट में, प्रोटोटाइपिकल विरासत समझ में आता है।
हालांकि, यदि आप ऐसी परिस्थिति में हैं जहां आपने सी # या जावा में इंटरफेस का उपयोग किया होगा, तो आपको जावास्क्रिप्ट में किसी विशेष भाषा सुविधा की आवश्यकता नहीं है। ,
var duck = {
quack: function() { ... }
};
duck.quack(); // we're satisfied it's a duck!
दूसरे शब्दों में यदि प्रत्येक वस्तु के "प्रकार" का अपना ही परिभाषा है: "के रूप में लागू करने" कि इंटरफ़ेस वस्तुओं को चिह्नित करने की कोई जरूरत नहीं स्पष्ट रूप से कुछ है कि इंटरफेस का प्रतिनिधित्व करता है की घोषणा करने की जरूरत है, और नहीं है "विधियों", फिर प्रोटोटाइप से विरासत में कोई मूल्य नहीं है। उसके बाद, यह इस बात पर निर्भर करता है कि आप प्रत्येक प्रकार के कितने उदाहरण आवंटित करते हैं। लेकिन कई मॉड्यूलर डिज़ाइनों में, दिए गए प्रकार का केवल एक उदाहरण होता है।
और वास्तव में, it has been suggested by many people that implementation inheritance is evil। यही है, यदि किसी प्रकार के लिए कुछ सामान्य संचालन हैं, तो शायद यह स्पष्ट है कि उन्हें आधार/सुपर क्लास में नहीं रखा गया है, लेकिन इसके बजाय कुछ मॉड्यूल में सामान्य कार्यों के रूप में उजागर किया गया है, जिसके लिए आप ऑब्जेक्ट पास करते हैं आप उन्हें चालू करना चाहते हैं।
अच्छी व्याख्या। तो क्या आप इस बात से सहमत होंगे कि, चूंकि आप प्रोटोटाइप को ऑप्टिमाइज़ेशन मानते हैं, तो इनका उपयोग हमेशा आपके कोड को बेहतर बनाने के लिए किया जा सकता है? मैं सोच रहा हूं कि ऐसे मामले हैं जहां प्रोटोटाइप का उपयोग करना समझ में नहीं आता है, या वास्तव में प्रदर्शन जुर्माना लगाता है। – opl
आपके अनुवर्ती अनुवर्ती में, आप उल्लेख करते हैं कि "यह इस बात पर निर्भर करता है कि आप प्रत्येक प्रकार के कितने आवंटन आवंटित करते हैं"। लेकिन उदाहरण के लिए आप प्रोटोटाइप का उपयोग नहीं कर रहे हैं। एक उदाहरण आवंटित करने की धारणा कहां है (क्या आप अभी भी "नया" उपयोग कर रहे हैं)? इसके अलावा: क्वैक विधि का पैरामीटर था - क्या duck.quack (param) का प्रत्येक आमंत्रण स्मृति में एक नई ऑब्जेक्ट बनने का कारण बनता है (शायद इसका अप्रासंगिक अगर उसके पास पैरामीटर है या नहीं)? – opl
** 1। ** मेरा मतलब था कि अगर एक प्रकार के बतख की बड़ी संख्या में उदाहरण थे, तो उदाहरण को संशोधित करना समझ जाएगा ताकि 'क्वाक' फ़ंक्शन प्रोटोटाइप में हो, जिसमें कई बतख उदाहरण जुड़े हुए हैं। ** 2। ** ऑब्जेक्ट शाब्दिक वाक्यविन्यास '{...} 'एक उदाहरण बनाता है (इसके साथ' नया 'उपयोग करने की आवश्यकता नहीं है)। ** 3। ** किसी भी फंक्शन को कॉल करना जेएस स्मृति में कम से कम एक ऑब्जेक्ट बनने का कारण बनता है - इसे 'तर्क' ऑब्जेक्ट कहा जाता है और कॉल में दिए गए तर्कों को संग्रहीत करता है: https://developer.mozilla.org/en/JavaScript/संदर्भ/functions_and_function_scope/तर्क –