प्रोटोटाइप एक अनुकूलन हैं ।
उन्हें अच्छी तरह से उपयोग करने का एक बड़ा उदाहरण jQuery लाइब्रेरी है। हर बार जब आप एक jQuery ऑब्जेक्ट प्राप्त करते हैं $('.someClass')
, तो उस ऑब्जेक्ट में दर्जनों "तरीके" होते हैं। किसी वस्तु को लौटाकर पुस्तकालय वह हासिल कर सकता है:
return {
show: function() { ... },
hide: function() { ... },
css: function() { ... },
animate: function() { ... },
// etc...
};
लेकिन इसका मतलब यह होगा कि मेमोरी में प्रत्येक jQuery ऑब्जेक्ट में दर्जनों नामांकित स्लॉट्स होंगे, जिनमें एक ही तरीके, बार-बार होंगे।
इसके बजाय, उन विधियों को एक प्रोटोटाइप और सभी jQuery ऑब्जेक्ट्स "इनहेरिट" पर परिभाषित किया गया है, ताकि प्रोटोटाइप उन सभी तरीकों को बहुत कम रनटाइम लागत पर प्राप्त कर सके।
JQuery कैसे सही है, इसका एक महत्वपूर्ण हिस्सा यह है कि यह प्रोग्रामर से छिपा हुआ है। यह पूरी तरह से एक अनुकूलन माना जाता है, ऐसा कुछ नहीं है जिसके बारे में आपको पुस्तकालय का उपयोग करते समय चिंता करनी होगी।
जावास्क्रिप्ट के साथ समस्या यह है कि नग्न निर्माण कार्यों के लिए कॉल करने की आवश्यकता होती है ताकि new
वे उन्हें याद रख सकें या अन्यथा वे आमतौर पर काम नहीं करते हैं। इसका कोई अच्छा कारण नहीं है। jQuery को एक सामान्य फ़ंक्शन के पीछे उस बकवास को छुपाकर सही हो जाता है $
, इसलिए आपको परवाह नहीं है कि ऑब्जेक्ट कैसे कार्यान्वित किए जाते हैं।
ताकि आप आसानी से एक निर्दिष्ट प्रोटोटाइप के साथ एक ऑब्जेक्ट बना सकें, ECMAScript 5 में एक मानक फ़ंक्शन शामिल है Object.create
। इसका एक बहुत ही सरल संस्करण इस तरह दिखेगा:
Object.create = function(prototype) {
var Type = function () {};
Type.prototype = prototype;
return new Type();
};
यह सिर्फ एक कंस्ट्रक्टर फ़ंक्शन लिखने और फिर इसे कॉल करने के दर्द का ख्याल रखता है new
।
आप प्रोटोटाइप से कब बचेंगे?
एक उपयोगी तुलना लोकप्रिय ओओ भाषाओं जैसे कि जावा और सी # के साथ है। ये दो प्रकार की विरासत का समर्थन करते हैं:
- इंटरफ़ेस विरासत है, जहां आप
implement
एक interface
ऐसे वर्ग इंटरफ़ेस के हर सदस्य के लिए अपनी अनूठी कार्यान्वयन प्रदान करता है।
- कार्यान्वयन विरासत है, जहां आप
extend
एक class
है कि कुछ तरीकों के डिफ़ॉल्ट कार्यान्वयन प्रदान करता है।
जावास्क्रिप्ट में, प्रोटोटाइप विरासत में कार्यान्वयन विरासत का एक प्रकार है । तो उन स्थितियों में जहां (सी # या जावा में) आप डिफ़ॉल्ट व्यवहार प्राप्त करने के लिए एक आधार वर्ग से निकले होंगे, जिसे आप तब ओवरराइड के माध्यम से छोटे संशोधन करते हैं, फिर जावास्क्रिप्ट में, प्रोटोटाइप विरासत में समझ में आता है।
हालाँकि, यदि आप ऐसी स्थिति में हैं जहाँ आपने C # या Java में इंटरफेस का उपयोग किया होगा, तो आपको जावास्क्रिप्ट में किसी विशेष भाषा सुविधा की आवश्यकता नहीं है। इंटरफ़ेस का प्रतिनिधित्व करने वाली किसी चीज़ को स्पष्ट रूप से घोषित करने की आवश्यकता नहीं है, और उस इंटरफ़ेस को "लागू करने" के रूप में वस्तुओं को चिह्नित करने की आवश्यकता नहीं है:
var duck = {
quack: function() { ... }
};
duck.quack(); // we're satisfied it's a duck!
दूसरे शब्दों में, यदि वस्तु के प्रत्येक "प्रकार" की "विधियों" की अपनी परिभाषा है, तो एक प्रोटोटाइप से विरासत में कोई मूल्य नहीं है। उसके बाद, यह इस बात पर निर्भर करता है कि आप प्रत्येक प्रकार के कितने उदाहरण आवंटित करते हैं। लेकिन कई मॉड्यूलर डिजाइनों में, दिए गए प्रकार का केवल एक उदाहरण है।
और वास्तव में, यह कई लोगों द्वारा सुझाया गया है कि कार्यान्वयन विरासत बुराई है । यही है, अगर किसी प्रकार के लिए कुछ सामान्य ऑपरेशन हैं, तो हो सकता है कि यह स्पष्ट हो अगर उन्हें आधार / सुपर क्लास में नहीं रखा गया है, लेकिन इसके बजाय केवल कुछ मॉड्यूल में सामान्य कार्यों के रूप में उजागर किया जाता है, जिससे आप ऑब्जेक्ट पास करते हैं आप उन्हें संचालित करना चाहते हैं।