प्रोटोटाइप-आधारित प्रोग्रामिंग: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 2: Line 2:
{{Distinguish|प्रोटोटाइप पैटर्न या |सॉफ्टवेयर प्रोटोटाइप के रूप में होते है।}}
{{Distinguish|प्रोटोटाइप पैटर्न या |सॉफ्टवेयर प्रोटोटाइप के रूप में होते है।}}
{{Programming paradigms}}
{{Programming paradigms}}
[[प्रोटोटाइप]] आधारित प्रोग्रामिंग [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] की एक शैली होती है, जिसमें प्रोटोटाइप के रूप में काम करने वाली उपलब्ध [[वस्तुओं]] का पुन: उपयोग करने की प्रक्रिया के माध्यम से इनहेरिटेंस प्रोग्रामिंग के रूप मेंजाना जाता है और जो प्रोटोटाइप के रूप में कार्य करता है। इस मॉडल को प्रोटोटाइप, प्रोटोटाइप-ओरिएंटेड क्लासलेस, या इंस्टेंस-आधारित प्रोग्रामिंग के रूप में भी जाना जाता है।
[[प्रोटोटाइप]] आधारित प्रोग्रामिंग [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] की एक शैली होती है, जिसमें प्रोटोटाइप के रूप में काम करने वाली उपलब्ध [[वस्तुओं|ऑब्जेक्ट ओं]] का पुन: उपयोग करने की प्रक्रिया के माध्यम से इनहेरिटेंस प्रोग्रामिंग के रूप मेंजाना जाता है और जो प्रोटोटाइप के रूप में कार्य करता है। इस मॉडल को प्रोटोटाइप, प्रोटोटाइप-ओरिएंटेड क्लासलेस, या इंस्टेंस-आधारित प्रोग्रामिंग के रूप में भी जाना जाता है।


प्रोटोटाइप-आधारित प्रोग्रामिंग सामान्यीकृत वस्तुओं की प्रक्रिया का उपयोग करती है, जिसे बाद में क्लोन और विस्तारित किया जाता है। एक उदाहरण के रूप में फ्रूट  का उपयोग फ्रूट  के गुणों और सामान्य रूप में फ्रूट  की कार्यक्षमता का प्रतिनिधित्व करता है। एक बनाना की वस्तु को फ्रूट  की वस्तु से क्लोन किया जाता है और केलों के लिए विशिष्ट सामान्य गुणों को जोड़ा जाता है। प्रत्येक व्यक्ति बनाना की वस्तु को सामान्य बनाना से क्लोन किया जाता है। और  [[कक्षा आधारित प्रोग्रामिंग|कक्षा आधारित पैराडाइम प्रोग्रामिंग]] से तुलना करने पर, जहाँ एक फ्रूट क्लास को बनाना के क्लास द्वारा विस्तारित किया जाता है।
प्रोटोटाइप-आधारित प्रोग्रामिंग सामान्यीकृत ऑब्जेक्ट ओं की प्रक्रिया का उपयोग करती है, जिसे बाद में क्लोन और विस्तारित किया जाता है। एक उदाहरण के रूप में फ्रूट  का उपयोग फ्रूट  के गुणों और सामान्य रूप में फ्रूट  की कार्यक्षमता का प्रतिनिधित्व करता है। एक बनाना की ऑब्जेक्ट  को फ्रूट  की ऑब्जेक्ट  से क्लोन किया जाता है और केलों के लिए विशिष्ट सामान्य गुणों को जोड़ा जाता है। प्रत्येक व्यक्ति बनाना की ऑब्जेक्ट  को सामान्य बनाना से क्लोन किया जाता है। और  [[कक्षा आधारित प्रोग्रामिंग|कक्षा आधारित पैराडाइम प्रोग्रामिंग]] से तुलना करने पर, जहाँ एक फ्रूट क्लास को बनाना के क्लास द्वारा विस्तारित किया जाता है।


पहली प्रोटोटाइप-ओरिएंटेड प्रोग्रामिंग लैंग्वेज [[स्वयं (प्रोग्रामिंग भाषा)|स्वयं (प्रोग्रामिंग लेन्गवेज )]] के रूप में थी, जिसे 1980 के दशक के मध्य में [[डेविड अनगर]] और रान्डेल स्मिथ द्वारा ऑब्जेक्ट-ओरिएंटेड लैंग्वेज डिज़ाइन के विषयों पर शोध करने के लिए विकसित किया गया था। 1990 के दशक के उत्तरार्ध से, वर्गहीन प्रतिमान तेजी से लोकप्रिय हो गया है। कुछ वर्तमान प्रोटोटाइप-उन्मुख लेन्गवेज एँ  [[जावास्क्रिप्ट]] और अन्य [[एकमा स्क्रिप्ट]] कार्यान्वयन इस रूप में होती है जैसे, [[JScript|जावास्क्रिप्ट]] और [[Adobe Flash|एडोब फ्लैश]] का [[ActionScript|एक्शन स्क्रिप्ट 1.0]], लुआ [[प्रोग्रामिंग भाषा|प्रोग्रामिंग लेन्गवेज]] , [[सेसिल (प्रोग्रामिंग भाषा)|सेसिल प्रोग्रामिंग लेन्गवेज]] , [[न्यूटनस्क्रिप्ट]], आईओ प्रोग्रामिंग लेन्गवेज , आईओकइ प्रोग्रामिंग लेन्गवेज , एमओओ प्रोग्रामिंग लेन्गवेज , [[REBOL|रेबोल]] और [[ऑटोहोट्की]] इत्यादि रूप में होती है।
पहली प्रोटोटाइप-ओरिएंटेड प्रोग्रामिंग लैंग्वेज [[स्वयं (प्रोग्रामिंग भाषा)|स्वयं (प्रोग्रामिंग लेन्गवेज )]] के रूप में थी, जिसे 1980 के दशक के मध्य में [[डेविड अनगर]] और रान्डेल स्मिथ द्वारा ऑब्जेक्ट-ओरिएंटेड लैंग्वेज डिज़ाइन के विषयों पर शोध करने के लिए विकसित किया गया था। 1990 के दशक के उत्तरार्ध से, वर्गहीन प्रतिमान तेजी से लोकप्रिय हो गया है। कुछ वर्तमान प्रोटोटाइप-उन्मुख लेन्गवेज एँ  [[जावास्क्रिप्ट]] और अन्य [[एकमा स्क्रिप्ट]] कार्यान्वयन इस रूप में होती है जैसे, [[JScript|जावास्क्रिप्ट]] और [[Adobe Flash|एडोब फ्लैश]] का [[ActionScript|एक्शन स्क्रिप्ट 1.0]], लुआ [[प्रोग्रामिंग भाषा|प्रोग्रामिंग लेन्गवेज]] , [[सेसिल (प्रोग्रामिंग भाषा)|सेसिल प्रोग्रामिंग लेन्गवेज]] , [[न्यूटनस्क्रिप्ट]], आईओ प्रोग्रामिंग लेन्गवेज , आईओकइ प्रोग्रामिंग लेन्गवेज , एमओओ प्रोग्रामिंग लेन्गवेज , [[REBOL|रेबोल]] और [[ऑटोहोट्की]] इत्यादि रूप में होती है।
Line 14: Line 14:
|यदि आप प्रोटोटाइप ऑब्जेक्ट बनाते हैं और फिर नए इंस्टैंसेस बनाते हैं। तो ऑब्जेक्ट जावास्क्रिप्ट में परिवर्तनशील रूप में  होती हैं, इसलिए हम उन नए उदाहरणों की वृद्धि कर सकते हैं, उन्हें नए क्षेत्रों और नई विधियाँ  द्वारा उपलब्ध करा सकते हैं। ये तब भी नए ऑब्जेक्ट्स के लिए प्रोटोटाइप के रूप में कार्य कर सकती हैं। हमें बहुत से समान ऑब्जेक्ट्स को बनाने के लिए कक्षाओं की आवश्यकता नहीं होती है, इनहेरिटेंस बेस क्लास से नई क्लास बनाने की प्रक्रिया है। इससे अधिक वस्तु उन्मुख क्या हो सकती है}}
|यदि आप प्रोटोटाइप ऑब्जेक्ट बनाते हैं और फिर नए इंस्टैंसेस बनाते हैं। तो ऑब्जेक्ट जावास्क्रिप्ट में परिवर्तनशील रूप में  होती हैं, इसलिए हम उन नए उदाहरणों की वृद्धि कर सकते हैं, उन्हें नए क्षेत्रों और नई विधियाँ  द्वारा उपलब्ध करा सकते हैं। ये तब भी नए ऑब्जेक्ट्स के लिए प्रोटोटाइप के रूप में कार्य कर सकती हैं। हमें बहुत से समान ऑब्जेक्ट्स को बनाने के लिए कक्षाओं की आवश्यकता नहीं होती है, इनहेरिटेंस बेस क्लास से नई क्लास बनाने की प्रक्रिया है। इससे अधिक वस्तु उन्मुख क्या हो सकती है}}


प्रोटोटाइप-आधारित प्रोग्रामिंग के अधिवक्ताओं का आशय है कि यह प्रोग्रामर को उदाहरणों के कुछ सेट के व्यवहार पर ध्यान केंद्रित करने के लिए प्रोत्साहित करता है और बाद में इन वस्तुओं को आर्किटेपल ऑब्जेक्ट्स में वर्गीकृत करने के बारे में चिंता करता है जो बाद में [[वर्ग (प्रोग्रामिंग)|क्लास (प्रोग्रामिंग)]] के समान फैशन में उपयोग किए जाते हैं।<ref name="Taivalsaari"/> कई प्रोटोटाइप-आधारित प्रणालियाँ रन टाइम प्रोग्राम जीवनचक्र चरण के समय  प्रोटोटाइप के परिवर्तन को प्रोत्साहित करती हैं, जबकि बहुत कम क्लास-आधारित ऑब्जेक्ट-ओरिएंटेड प्रणाली जैसे डायनेमिक ऑब्जेक्ट-ओरिएंटेड प्रणाली , [[सामान्य लिस्प]], डायलन प्रोग्रामिंग लैंग्वेज, [[उद्देश्य सी|ऑब्जेक्टिव सी]], [[पर्ल]], पायथन प्रोग्रामिंग लैंग्वेज, [[रूबी (प्रोग्रामिंग भाषा)|रूबी प्रोग्रामिंग लेन्गवेज]] , या स्मॉलटाक, किसी प्रोग्राम के निष्पादन के समय  कक्षाओं को बदलने की अनुमति देते हैं।
प्रोटोटाइप-आधारित प्रोग्रामिंग के अधिवक्ताओं का आशय है कि यह प्रोग्रामर को उदाहरणों के कुछ सेट के व्यवहार पर ध्यान केंद्रित करने के लिए प्रोत्साहित करता है और बाद में इन ऑब्जेक्ट ओं को आर्किटेपल ऑब्जेक्ट्स में वर्गीकृत करने के बारे में चिंता करता है जो बाद में [[वर्ग (प्रोग्रामिंग)|क्लास (प्रोग्रामिंग)]] के समान फैशन में उपयोग किए जाते हैं।<ref name="Taivalsaari"/> कई प्रोटोटाइप-आधारित प्रणालियाँ रन टाइम प्रोग्राम जीवनचक्र चरण के समय  प्रोटोटाइप के परिवर्तन को प्रोत्साहित करती हैं, जबकि बहुत कम क्लास-आधारित ऑब्जेक्ट-ओरिएंटेड प्रणाली जैसे डायनेमिक ऑब्जेक्ट-ओरिएंटेड प्रणाली , [[सामान्य लिस्प]], डायलन प्रोग्रामिंग लैंग्वेज, [[उद्देश्य सी|ऑब्जेक्टिव सी]], [[पर्ल]], पायथन प्रोग्रामिंग लैंग्वेज, [[रूबी (प्रोग्रामिंग भाषा)|रूबी प्रोग्रामिंग लेन्गवेज]] , या स्मॉलटाक, किसी प्रोग्राम के निष्पादन के समय  कक्षाओं को बदलने की अनुमति देते हैं।


लगभग सभी प्रोटोटाइप-आधारित प्रणालियाँ [[व्याख्या की गई भाषा|व्याख्याकृत]] और गतिशील रूप से टाइप की गई लेन्गवेज ओं पर आधारित होती है। चूंकि , वैधानिक रूप से टाइप की गई लेन्गवेज ओं पर आधारित प्रणालियाँ प्रौद्योगिकी रूप से व्यवहार्य होती है। ओमेगा की वेबसाइट पर वाद विवाद की गई है<ref>{{cite book | chapter = Section 2.8 | page = 177 | first = Günther | last = Blaschek | title = Omega: Statically Typed Prototypes }}</ref> ओमेगा की लेन्गवेज  इस प्रकार की प्रणाली का उदाहरण है, चूंकि  ओमेगा की वेबसाइट के अनुसार यह स्थिर नहीं है बल्कि यह संभव है कि वह ओमेगा को स्टेटिक बाइंडिंग के रूप में उपयोग कर सकता है, जहां यह संभव है और यह एक प्रोग्राम की कार्यक्षमता में सुधार कर सकता है।
लगभग सभी प्रोटोटाइप-आधारित प्रणालियाँ [[व्याख्या की गई भाषा|व्याख्याकृत]] और गतिशील रूप से टाइप की गई लेन्गवेज ओं पर आधारित होती है। चूंकि , वैधानिक रूप से टाइप की गई लेन्गवेज ओं पर आधारित प्रणालियाँ प्रौद्योगिकी रूप से व्यवहार्य होती है। ओमेगा की वेबसाइट पर वाद विवाद की गई है<ref>{{cite book | chapter = Section 2.8 | page = 177 | first = Günther | last = Blaschek | title = Omega: Statically Typed Prototypes }}</ref> ओमेगा की लेन्गवेज  इस प्रकार की प्रणाली का उदाहरण है, चूंकि  ओमेगा की वेबसाइट के अनुसार यह स्थिर नहीं है बल्कि यह संभव है कि वह ओमेगा को स्टेटिक बाइंडिंग के रूप में उपयोग कर सकता है, जहां यह संभव है और यह एक प्रोग्राम की कार्यक्षमता में सुधार कर सकता है।


== वस्तु निर्माण ==
== ऑब्जेक्ट  निर्माण ==
प्रोटोटाइप-आधारित लेन्गवेज ओं में स्पष्ट क्लास नहीं होते हैं। ऑब्जेक्ट एक प्रोटोटाइप गुण के माध्यम से अन्य वस्तुओं से सीधे प्राप्त होते हैं। प्रोटोटाइप गुण को स्वयं और जावास्क्रिप्ट में प्रोटोटाइप या आईओ में प्रोटो कहा जाता है। नई वस्तुओं के निर्माण की दो विधियाँ होती है पूर्व निहिलो वस्तु निर्माण से किसी सम्मलित वस्तु की क्लोनिंग के माध्यम से होती है और पूर्व ऑब्जेक्ट लिटरल कंप्यूटर प्रोग्रामिंग के कुछ रूपों के माध्यम से समर्थित किया जाता है और घोषणाएं जहां वस्तुओं को रनटाइम पर विशेष सिंटैक्स के माध्यम से परिभाषित किया जा सकता है जैसे <code>{...}</code> और सीधे एक चर के पास गया। जबकि अधिकांश प्रणालियाँ विभिन्न प्रकार के क्लोनिंग का समर्थन करती हैं, पूर्व निहिलो वस्तु का निर्माण उतना महत्वपूर्ण नहीं है।<ref>{{cite book | chapter = Section 1.2 | page = 17 | first1 = Chistophe | last1 = Dony | first2 = Jacques | last2 = Malenfan | first3 = Daniel | last3 = Bardou | chapter-url = http://www.lirmm.fr/~dony/postscript/proto-book.pdf | title = Classifying Prototype-based Programming Languages }}</ref>
प्रोटोटाइप-आधारित लेन्गवेज ओं में स्पष्ट क्लास नहीं होते हैं। ऑब्जेक्ट एक प्रोटोटाइप गुण के माध्यम से अन्य ऑब्जेक्ट ओं से सीधे प्राप्त होते हैं। प्रोटोटाइप गुण को स्वयं और जावास्क्रिप्ट में प्रोटोटाइप या आईओ में प्रोटो कहा जाता है। नई ऑब्जेक्ट ओं के निर्माण की दो विधियाँ होती है पूर्व निहिलो ऑब्जेक्ट  निर्माण से किसी सम्मलित ऑब्जेक्ट  की क्लोनिंग के माध्यम से होती है और पूर्व ऑब्जेक्ट लिटरल कंप्यूटर प्रोग्रामिंग के कुछ रूपों के माध्यम से समर्थित किया जाता है और घोषणाएं जहां ऑब्जेक्ट ओं को रनटाइम पर विशेष सिंटैक्स के माध्यम से परिभाषित किया जा सकता है जैसे <code>{...}</code> और सीधे एक चर के पास गया। जबकि अधिकांश प्रणालियाँ विभिन्न प्रकार के क्लोनिंग का समर्थन करती हैं, पूर्व निहिलो ऑब्जेक्ट  का निर्माण उतना महत्वपूर्ण नहीं है।<ref>{{cite book | chapter = Section 1.2 | page = 17 | first1 = Chistophe | last1 = Dony | first2 = Jacques | last2 = Malenfan | first3 = Daniel | last3 = Bardou | chapter-url = http://www.lirmm.fr/~dony/postscript/proto-book.pdf | title = Classifying Prototype-based Programming Languages }}</ref>


क्लास-आधारित लेन्गवेज ओं में, एक क्लास के [[कंस्ट्रक्टर (कंप्यूटर साइंस)]] के माध्यम से एक नया उदाहरण बनाया जाता है, एक विशेष फलन जो ऑब्जेक्ट के सदस्यों (गुणों और विधियों) के लिए मेमोरी का एक ब्लॉक आरक्षित करता है और उस ब्लॉक का संदर्भ देता है। कन्स्ट्रक्टर पैरामीटर कंप्यूटर साइंस का एक वैकल्पिक सेट फलन में पारित किया जाता है और सामान्यतः  गुणों में आयोजित किया जाता है। परिणामी उदाहरण क्लास में परिभाषित सभी विधियों और गुणों को इनहेरिट करता है, जो एक प्रकार के टेम्पलेट के रूप में कार्य करता है जिससे समान टाइप की गई वस्तुओं का निर्माण किया जाता है।
क्लास-आधारित लेन्गवेज ओं में, एक क्लास के [[कंस्ट्रक्टर (कंप्यूटर साइंस)]] के माध्यम से एक नया उदाहरण बनाया जाता है, एक विशेष फलन जो ऑब्जेक्ट के सदस्यों (गुणों और विधियों) के लिए मेमोरी का एक ब्लॉक आरक्षित करता है और उस ब्लॉक का संदर्भ देता है। कन्स्ट्रक्टर पैरामीटर कंप्यूटर साइंस का एक वैकल्पिक सेट फलन में पारित किया जाता है और सामान्यतः  गुणों में आयोजित किया जाता है। परिणामी उदाहरण क्लास में परिभाषित सभी विधियों और गुणों को इनहेरिट करता है, जो एक प्रकार के टेम्पलेट के रूप में कार्य करता है जिससे समान टाइप की गई ऑब्जेक्ट ओं का निर्माण किया जाता है।


प्रणाली जो पूर्व निहिलो ऑब्जेक्ट निर्माण का समर्थन करते हैं, सम्मलित प्रोटोटाइप से क्लोनिंग के बिना नई वस्तुओं को खरोंच से बनाने की अनुमति देते हैं। ऐसी प्रणालियाँ सम्मलित वस्तुओं को संदर्भित किए बिना नई वस्तुओं के गुणों और व्यवहारों को निर्दिष्ट करने के लिए एक विशेष सिंटैक्स प्रदान करती हैं। कई प्रोटोटाइप लेन्गवेज ओं में एक रूट ऑब्जेक्ट सम्मलित  होता है, जिसे अधिकांशतः  ऑब्जेक्ट कहा जाता है, जिसे रन-टाइम में बनाए गए अन्य सभी ऑब्जेक्ट्स के लिए डिफ़ॉल्ट प्रोटोटाइप के रूप में सेट किया जाता है और जिसमें सामान्य रूप से आवश्यक विधि होते हैं जैसे कि <code>टूस्ट्रिंग()</code> एक स्ट्रिंग के रूप में वस्तु का विवरण वापस करने के लिए कार्य के रूप में होता है। पूर्व निहिलो ऑब्जेक्ट निर्माण का एक उपयोगी पहलू यह सुनिश्चित करता है कि एक नए ऑब्जेक्ट के स्लॉट गुण और विधियाँ के नाम में शीर्ष-स्तरीय ऑब्जेक्ट के साथ [[नाम स्थान|नेम स्पेस]]  का विरोध नहीं करती है। जावास्क्रिप्ट लेन्गवेज  में, कोई शून्य प्रोटोटाइप का उपयोग कर ऐसा कर सकता है, अर्थात उदाहरण कुछ इस प्रकार है, <code>Object.create(null)</code>.)
प्रणाली जो पूर्व निहिलो ऑब्जेक्ट निर्माण का समर्थन करते हैं, सम्मलित प्रोटोटाइप से क्लोनिंग के बिना नई ऑब्जेक्ट ओं को खरोंच से बनाने की अनुमति देते हैं। ऐसी प्रणालियाँ सम्मलित ऑब्जेक्ट ओं को संदर्भित किए बिना नई ऑब्जेक्ट ओं के गुणों और व्यवहारों को निर्दिष्ट करने के लिए एक विशेष सिंटैक्स प्रदान करती हैं। कई प्रोटोटाइप लेन्गवेज ओं में एक रूट ऑब्जेक्ट सम्मलित  होता है, जिसे अधिकांशतः  ऑब्जेक्ट कहा जाता है, जिसे रन-टाइम में बनाए गए अन्य सभी ऑब्जेक्ट्स के लिए डिफ़ॉल्ट प्रोटोटाइप के रूप में सेट किया जाता है और जिसमें सामान्य रूप से आवश्यक विधि होते हैं जैसे कि <code>टूस्ट्रिंग()</code> एक स्ट्रिंग के रूप में ऑब्जेक्ट  का विवरण वापस करने के लिए कार्य के रूप में होता है। पूर्व निहिलो ऑब्जेक्ट निर्माण का एक उपयोगी पहलू यह सुनिश्चित करता है कि एक नए ऑब्जेक्ट के स्लॉट गुण और विधियाँ के नाम में शीर्ष-स्तरीय ऑब्जेक्ट के साथ [[नाम स्थान|नेम स्पेस]]  का विरोध नहीं करती है। जावास्क्रिप्ट लेन्गवेज  में, कोई शून्य प्रोटोटाइप का उपयोग कर ऐसा कर सकता है, अर्थात उदाहरण कुछ इस प्रकार है, <code>Object.create(null)</code>.)


क्लोनिंग एक ऐसी प्रक्रिया को संदर्भित करता है जिससे किसी सम्मलित  वस्तु उसके प्रोटोटाइप के व्यवहार की नकल करके एक नई वस्तु का निर्माण किया जाता है। नई वस्तु तब मूल के सभी गुणों को वहन करती है। इस बिंदु से, नई वस्तु को संशोधित किया जाता है। कुछ प्रणालियों में परिणामी चाइल्ड ऑब्जेक्ट अपने प्रोटोटाइप के लिए एक स्पष्ट लिंक डेलिगेशन ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग या [[समानता (प्रोग्रामिंग)]] के माध्यम से बनाए रखता है और प्रोटोटाइप में बदलाव के कारण इसके क्लोन में स्पष्ट परिवर्तन होते हैं। अन्य प्रणालियाँ, जैसे [[फोर्थ (प्रोग्रामिंग भाषा)|फोर्थ (प्रोग्रामिंग लेन्गवेज)]]  [[केवो (प्रोग्रामिंग भाषा)|केवो (प्रोग्रामिंग लेन्गवेज )]], इस प्रकार  से प्रोटोटाइप से परिवर्तन को प्रत्यक्ष नहीं करती हैं और इसके अतिरिक्त एक अधिक सुसंगत मॉडल का पालन करती हैं, जहाँ क्लोन ऑब्जेक्ट्स में परिवर्तन स्वचालित रूप से तनय में नहीं फैलते हैं।<ref name="Taivalsaari">{{cite book | chapter = Section 1.1 | first = Antero | last = Taivalsaari | title = Classes vs. Prototypes: Some Philosophical and Historical Observations | year = 1996 | pages = 44–50 | citeseerx = 10.1.1.56.4713 }}</ref>
क्लोनिंग एक ऐसी प्रक्रिया को संदर्भित करता है जिससे किसी सम्मलित  ऑब्जेक्ट  उसके प्रोटोटाइप के व्यवहार की नकल करके एक नई ऑब्जेक्ट  का निर्माण किया जाता है। नई ऑब्जेक्ट  तब मूल के सभी गुणों को वहन करती है। इस बिंदु से, नई ऑब्जेक्ट  को संशोधित किया जाता है। कुछ प्रणालियों में परिणामी चाइल्ड ऑब्जेक्ट अपने प्रोटोटाइप के लिए एक स्पष्ट लिंक डेलिगेशन ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग या [[समानता (प्रोग्रामिंग)]] के माध्यम से बनाए रखता है और प्रोटोटाइप में बदलाव के कारण इसके क्लोन में स्पष्ट परिवर्तन होते हैं। अन्य प्रणालियाँ, जैसे [[फोर्थ (प्रोग्रामिंग भाषा)|फोर्थ (प्रोग्रामिंग लेन्गवेज)]]  [[केवो (प्रोग्रामिंग भाषा)|केवो (प्रोग्रामिंग लेन्गवेज )]], इस प्रकार  से प्रोटोटाइप से परिवर्तन को प्रत्यक्ष नहीं करती हैं और इसके अतिरिक्त एक अधिक सुसंगत मॉडल का पालन करती हैं, जहाँ क्लोन ऑब्जेक्ट्स में परिवर्तन स्वचालित रूप से तनय में नहीं फैलते हैं।<ref name="Taivalsaari">{{cite book | chapter = Section 1.1 | first = Antero | last = Taivalsaari | title = Classes vs. Prototypes: Some Philosophical and Historical Observations | year = 1996 | pages = 44–50 | citeseerx = 10.1.1.56.4713 }}</ref>


// Example of true prototypal inheritance style  
// Example of true prototypal inheritance style  
Line 70: Line 70:
bar.one; // 1 bar.two; // 2 bar.three; // 3
bar.one; // 1 bar.two; // 2 bar.three; // 3
== प्रतिनिधिमंडल ==
== प्रतिनिधिमंडल ==
प्रोटोटाइप-आधारित लेन्गवेज में जो प्रत्यायोजन का उपयोग करती हैं, लेन्गवेज  रनटाइम [[गतिशील प्रेषण]] सही विधि या डेटा का सही भाग खोजने में सक्षम होती है, . केवल प्रतिनिधिमंडल की एक श्रृंखला का अनुसरण करके उद्देश्य से इसके प्रतिरूप तक जब तक मिलान पाया जाता है.इस व्यवहार को वस्तुओं के बीच स्थापित करने के लिए डेलिगेशन पॉइंटर की जरूरत होती है। क्लास-आधारित ऑब्जेक्ट-ओरिएंटेड लेन्गवेज में क्लास और इंस्टेंस के बीच संबंध के विपरीत प्रोटोटाइप और उसके ऑफशूट के बीच संबंध के लिए यह आवश्यक नहीं है कि चाइल्ड ऑब्जेक्ट में इस लिंक से परे प्रोटोटाइप के लिए मेमोरी या संरचनात्मक समानता हो। जैसे, क्लास-आधारित प्रणाली के रूप में इसके संबंधित प्रोटोटाइप की संरचना को पुनर्व्यवस्थित किए बिना समय के साथ चाइल्ड ऑब्जेक्ट को संशोधित करना जारी रखा जाता है। यह जानना भी महत्वपूर्ण है कि न केवल डेटा, अपितु  विधियों को भी जोड़ा या बदला जा सकता है। इस कारण से, कुछ प्रोटोटाइप-आधारित लेन्गवेज डेटा और विधियों दोनों को स्लॉट या सदस्य के रूप में संदर्भित करती हैं।
प्रोटोटाइप-आधारित लेन्गवेज में जो प्रत्यायोजन का उपयोग करती हैं, लेन्गवेज  रनटाइम [[गतिशील प्रेषण]] सही विधि या डेटा का सही भाग खोजने में सक्षम होती है, . केवल प्रतिनिधिमंडल की एक श्रृंखला का अनुसरण करके उद्देश्य से इसके प्रतिरूप तक जब तक मिलान पाया जाता है.इस व्यवहार को ऑब्जेक्ट ओं के बीच स्थापित करने के लिए डेलिगेशन पॉइंटर की जरूरत होती है। क्लास-आधारित ऑब्जेक्ट-ओरिएंटेड लेन्गवेज में क्लास और इंस्टेंस के बीच संबंध के विपरीत प्रोटोटाइप और उसके ऑफशूट के बीच संबंध के लिए यह आवश्यक नहीं है कि चाइल्ड ऑब्जेक्ट में इस लिंक से परे प्रोटोटाइप के लिए मेमोरी या संरचनात्मक समानता हो। जैसे, क्लास-आधारित प्रणाली के रूप में इसके संबंधित प्रोटोटाइप की संरचना को पुनर्व्यवस्थित किए बिना समय के साथ चाइल्ड ऑब्जेक्ट को संशोधित करना जारी रखा जाता है। यह जानना भी महत्वपूर्ण है कि न केवल डेटा, अपितु  विधियों को भी जोड़ा या बदला जा सकता है। इस कारण से, कुछ प्रोटोटाइप-आधारित लेन्गवेज डेटा और विधियों दोनों को स्लॉट या सदस्य के रूप में संदर्भित करती हैं।
== संयोजन ==
== संयोजन ==
समसामयिक प्रोटोटाइप में - केवो प्रोग्रामिंग लेन्गवेज  द्वारा कार्यान्वित दृष्टिकोण - मूल प्रोटोटाइप के लिए कोई दृश्य संकेत या लिंक नहीं हैं जिससे किसी वस्तु का क्लोन बनाया जाता है। प्रोटोटाइप (पैरेंट) ऑब्जेक्ट को लिंक करने के अतिरिक्त  कॉपी किया गया है और कोई डेलिगेशन नहीं है। परिणामस्वरुप, क्लोन किए गए ऑब्जेक्ट्स में प्रोटोटाइप में परिवर्तन दिखाई नहीं देंगे।<ref name=Taivalsaar>{{cite web | url = http://lively.cs.tut.fi/ | title = Simplifying JavaScript with Concatenation-Based Prototype Inheritance | author = Antero Taivalsaar | language = en | publisher = Tampere University of Technology | date = 2009 | archive-url = http://lively.cs.tut.fi/publications/TR6-JavaScriptConcatenation-Taivalsaari.pdf | archive-date = 2009 | quote = Kevo implemented a pure concatenation-based object model in which new objects were created by copying and the namespaces of all the objects were always fully self-contained. … Furthermore, Kevo had an internal ''clone family'' mechanism that made it possible to track the “genealogy” of changes among groups of objects, so that changes to individual objects could be propagated to other objects when necessary. | access-date = 2015-03-11}}</ref>
समसामयिक प्रोटोटाइप में केवो प्रोग्रामिंग लेन्गवेज  द्वारा कार्यान्वित दृष्टिकोण मूल प्रोटोटाइप के लिए कोई दृश्य संकेत या लिंक के रूप में नहीं होती है, जिससे किसी ऑब्जेक्ट  का क्लोन बनाया जाता है। प्रोटोटाइप (पैरेंट) ऑब्जेक्ट को लिंक करने के अतिरिक्त  कॉपी किया गया है और कोई डेलिगेशन नहीं है। परिणामस्वरुप, क्लोन किए गए ऑब्जेक्ट्स में प्रोटोटाइप में परिवर्तन दिखाई नहीं देते है।<ref name=Taivalsaar>{{cite web | url = http://lively.cs.tut.fi/ | title = Simplifying JavaScript with Concatenation-Based Prototype Inheritance | author = Antero Taivalsaar | language = en | publisher = Tampere University of Technology | date = 2009 | archive-url = http://lively.cs.tut.fi/publications/TR6-JavaScriptConcatenation-Taivalsaari.pdf | archive-date = 2009 | quote = Kevo implemented a pure concatenation-based object model in which new objects were created by copying and the namespaces of all the objects were always fully self-contained. … Furthermore, Kevo had an internal ''clone family'' mechanism that made it possible to track the “genealogy” of changes among groups of objects, so that changes to individual objects could be propagated to other objects when necessary. | access-date = 2015-03-11}}</ref>
इस व्यवस्था के अनुसार  मुख्य वैचारिक अंतर यह है कि प्रोटोटाइप ऑब्जेक्ट में किए गए परिवर्तन स्वचालित रूप से क्लोन के लिए प्रचारित नहीं होते हैं। इसे फायदे या नुकसान के तौर पर देखा जा सकता है। (चूंकि , केवो समानता के आधार पर वस्तुओं के सेट में परिवर्तन प्रकाशित करने के लिए अतिरिक्त आदिम प्रदान करता है - तथाकथित पारिवारिक समानताएं या क्लोन परिवार तंत्र<ref name=Taivalsaar />- टैक्सोनोमिक उत्पत्ति के अतिरिक्त , जैसा कि प्रतिनिधिमंडल मॉडल में विशिष्ट है।) यह भी कभी-कभी प्रमाणित  किया जाता है कि प्रतिनिधिमंडल-आधारित प्रोटोटाइप में एक अतिरिक्त नुकसान होता है, जो कि बच्चे की वस्तु में परिवर्तन माता-पिता के बाद के संचालन को प्रभावित कर सकता है। चूंकि , यह समस्या प्रतिनिधिमंडल-आधारित मॉडल में निहित नहीं है और जावास्क्रिप्ट जैसी प्रतिनिधिमंडल-आधारित लेन्गवेज ओं में सम्मलित  नहीं है, जो यह सुनिश्चित करती है कि चाइल्ड ऑब्जेक्ट में परिवर्तन निरंतर  चाइल्ड ऑब्जेक्ट में ही रिकॉर्ड किए जाते हैं और माता-पिता में कभी नहीं (अर्थात बच्चे के मूल्य माता-पिता के मूल्य को बदलने के अतिरिक्त  माता-पिता के मूल्य को छाया देता है)।


सरल कार्यान्वयन में, समवर्ती प्रोटोटाइप में प्रतिनिधिमंडल-आधारित प्रोटोटाइप की तुलना में तेज़ सदस्य लुकअप होगा (क्योंकि मूल वस्तुओं की श्रृंखला का पालन करने की कोई आवश्यकता नहीं है), लेकिन इसके विपरीत अधिक मेमोरी का उपयोग करेगा (क्योंकि सभी स्लॉट कॉपी किए गए हैं, बजाय एकल होने के मूल वस्तु की ओर इशारा करते हुए स्लॉट)। चूंकि , अधिक परिष्कृत कार्यान्वयन इस समस्या से बच सकते हैं, चूंकि , गति और स्मृति के बीच व्यापार-नापसंद की आवश्यकता होती है। उदाहरण के लिए, समसामयिक प्रोटोटाइप वाली प्रणालियाँ पर्दे के पीछे के डेटा साझा करने की अनुमति देने के लिए [[लिखने पर नकल]] कार्यान्वयन का उपयोग कर सकती हैं - और इस प्रकार  के दृष्टिकोण का वास्तव में केवो द्वारा पालन किया जाता है।<ref>{{cite journal | first = Antero | last = Taivalsaari | title = Kevo, a prototype-based object-oriented programming language based on concatenation and module operations | journal = Technical Report Report LACIR 92-02 | publisher = University of Victoria | year = 1992 }}</ref> इसके विपरीत, डेलिगेशन-आधारित प्रोटोटाइप वाले प्रणाली डेटा लुकअप को गति देने के लिए [[कैश (कंप्यूटिंग)]] का उपयोग कर सकते हैं।
इस व्यवस्था के अनुसार  मुख्य वैचारिक अंतर यह है कि प्रोटोटाइप ऑब्जेक्ट में किए गए परिवर्तन स्वचालित रूप से क्लोन के लिए प्रचारित नहीं होते हैं। इसे लाभ या नुकसान के रूप में देखा जा सकता है। चूंकि, केवो समानता के आधार पर ऑब्जेक्ट ओं के सेट में परिवर्तन प्रकाशित करने के लिए अतिरिक्त प्राचीन रूप प्रदान करता है, तथाकथित पारिवारिक समानताएं या क्लोन परिवार तंत्र<ref name="Taivalsaar" /> के आधार पर ऑब्जेक्ट ओं के समूहों में परिवर्तनों के प्रकाशन के लिए अतिरिक्त प्राइमाइज प्रदान करता है। यह भी कभी-कभी प्रमाणित  किया जाता है कि प्रतिनिधिमंडल-आधारित प्रोटोटाइप में एक अतिरिक्त नुकसान होता है, जो कि चाइल्ड की ऑब्जेक्ट में परिवर्तन पैरेंट  के बाद के संचालन को प्रभावित करता है। चूंकि, यह समस्या प्रतिनिधिमंडल-आधारित मॉडल में निहित नहीं होती है और जावास्क्रिप्ट जैसी प्रतिनिधिमंडल आधारित लेन्गवेज में सम्मलित  नहीं होती है, जो यह सुनिश्चित करती है कि चाइल्ड ऑब्जेक्ट में परिवर्तन निरंतर चाइल्ड ऑब्जेक्ट में ही रिकॉर्ड किए जाते हैं और पैरेंट  में कभी नहीं अर्थात चाइल्ड  के मूल्य पैरेंट  के मूल्य को बदलने के अतिरिक्त  पैरेंट  के मूल्य को छाया प्रदान करता है।
 
सरल कार्यान्वयन में, समवर्ती प्रोटोटाइप में प्रतिनिधिमंडल आधारित प्रोटोटाइप की तुलना में तेज़ सदस्य लुकअप रूप में होता है क्योंकि मूल ऑब्जेक्ट की श्रृंखला का पालन करने की कोई आवश्यकता नहीं होती है, लेकिन इसके विपरीत अधिक मेमोरी का उपयोग करता है, क्योंकि पैरेंट ऑब्जेक्ट की ओर इशारा करते हुए एकल स्लॉट होने के अतिरिक्त सभी स्लॉट कॉपी किए जाते हैं। चूंकि, अधिक परिष्कृत कार्यान्वयन इस समस्या से बच सकते हैं, चूंकि गति और स्मृति के बीच व्यापार बंद की आवश्यकता होती है। उदाहरण के लिए, समसामयिक प्रोटोटाइप वाली प्रणालियाँ पर्दे के पीछे के डेटा साझा करने की अनुमति देने के लिए [[लिखने पर नकल|लेखन]] कार्यान्वयन का उपयोग करती हैं और इस प्रकार  के दृष्टिकोण का वास्तव में केवो द्वारा पालन किया जाता है।<ref>{{cite journal | first = Antero | last = Taivalsaari | title = Kevo, a prototype-based object-oriented programming language based on concatenation and module operations | journal = Technical Report Report LACIR 92-02 | publisher = University of Victoria | year = 1992 }}</ref> इसके विपरीत, डेलिगेशन-आधारित प्रोटोटाइप वाले प्रणाली डेटा लुकअप को गति देने के लिए [[कैश (कंप्यूटिंग)|कैशिंग (कंप्यूटिंग)]] का उपयोग करते हैं।


== आलोचना ==
== आलोचना ==
क्लास-आधारित ऑब्जेक्ट मॉडल के पैरोकार जो प्रोटोटाइप-आधारित प्रणाली की आलोचना करते हैं, अधिकांशतः  उन चिंताओं के समान होते हैं जो प्रोग्रामिंग लेन्गवेज ओं के लिए स्टैटिक टाइप प्रणाली के समर्थकों के पास डायनेमिक टाइप प्रणाली होते हैं ([[डेटा प्रकार]] देखें)। सामान्यतः , ऐसी चिंताओं में [[शुद्धता (कंप्यूटर विज्ञान)]], [[प्रकार की सुरक्षा]], पूर्वानुमेयता, [[एल्गोरिथम दक्षता]] और प्रोग्रामर अपरिचितता सम्मलित  होती है।
क्लास-आधारित ऑब्जेक्ट मॉडल के पैरोकार जो प्रोटोटाइप-आधारित प्रणाली की आलोचना करते हैं, अधिकांशतः  उन चिंताओं के समान होते हैं जो प्रोग्रामिंग लेन्गवेज ओं के लिए स्टैटिक टाइप प्रणाली के समर्थकों के पास डायनेमिक टाइप प्रणाली होते हैं ([[डेटा प्रकार]] देखें)। सामान्यतः , ऐसी चिंताओं में [[शुद्धता (कंप्यूटर विज्ञान)]], [[प्रकार की सुरक्षा]], पूर्वानुमेयता, [[एल्गोरिथम दक्षता]] और प्रोग्रामर अपरिचितता सम्मलित  होती है।


पहले तीन बिंदुओं पर, कक्षाओं को अधिकांशतः  प्रकारों के अनुरूप देखा जाता है (अधिकांश वैधानिक रूप से टाइप की गई वस्तु-उन्मुख लेन्गवेज ओं में वे उस भूमिका को पूरा करते हैं) और उनके उदाहरणों और उनके उदाहरणों के उपयोगकर्ताओं को संविदात्मक गारंटी प्रदान करने का प्रस्ताव है, कि वे व्यवहार करेंगे किसी दिए गए फैशन में।
पहले तीन बिंदुओं पर, कक्षाओं को अधिकांशतः  प्रकारों के अनुरूप देखा जाता है (अधिकांश वैधानिक रूप से टाइप की गई ऑब्जेक्ट -उन्मुख लेन्गवेज ओं में वे उस भूमिका को पूरा करते हैं) और उनके उदाहरणों और उनके उदाहरणों के उपयोगकर्ताओं को संविदात्मक गारंटी प्रदान करने का प्रस्ताव है, कि वे व्यवहार करेंगे किसी दिए गए फैशन में।


दक्षता के संबंध में, कक्षाएं घोषित करना कई [[संकलक]] अनुकूलन को सरल करता है जो कुशल विधि और उदाहरण-चर लुकअप को विकसित करने की अनुमति देता है। स्व (प्रोग्रामिंग लेन्गवेज ) लेन्गवेज  के लिए, प्रोटोटाइप-आधारित प्रणाली बनाम क्लास-आधारित प्रणाली के प्रदर्शन को बहुत अच्छा  बनाने के लिए तकनीकों के विकास, संकलन और व्याख्या पर बहुत अधिक समय व्यतीत किया गया था।
दक्षता के संबंध में, कक्षाएं घोषित करना कई [[संकलक]] अनुकूलन को सरल करता है जो कुशल विधि और उदाहरण-चर लुकअप को विकसित करने की अनुमति देता है। स्व (प्रोग्रामिंग लेन्गवेज ) लेन्गवेज  के लिए, प्रोटोटाइप-आधारित प्रणाली बनाम क्लास-आधारित प्रणाली के प्रदर्शन को बहुत अच्छा  बनाने के लिए तकनीकों के विकास, संकलन और व्याख्या पर बहुत अधिक समय व्यतीत किया गया था।


प्रोटोटाइप-आधारित लेन्गवेज ओं के विरुद्ध  एक आम आलोचना यह है कि जावास्क्रिप्ट की लोकप्रियता और बाजार में प्रवेश के बावजूद [[सॉफ्टवेयर डेवलपर]]्स का समुदाय उनसे अपरिचित है। प्रोटोटाइप-आधारित प्रणाली का यह ज्ञान स्तर [[जावास्क्रिप्ट ढांचा]] के प्रसार और [[वर्ल्ड वाइड वेब]] के परिपक्व होने के साथ जावास्क्रिप्ट के जटिल उपयोग के साथ बढ़ रहा है।<ref>{{Cite news|url=https://alistapart.com/article/prototypal-object-oriented-programming-using-javascript|title=Prototypal Object-Oriented Programming using JavaScript|date=2016-04-26|work=A List Apart|access-date=2018-10-21|language=en-US}}</ref>{{citation needed|date=March 2013}} ईसीएमएस्क्रिप्ट 6 ने जावास्क्रिप्ट के सम्मलित  ा प्रोटोटाइप-आधारित इनहेरिटेंस पर [[सिंटैक्टिक चीनी]] के रूप में कक्षाएं प्रस्तुत  कीं, वस्तुओं को बनाने और इनहेरिटेंस से निपटने का एक वैकल्पिक विधियो  प्रदान किया।<ref>{{cite web|title=कक्षाओं|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/कक्षाओं|website=JavaScript reference|publisher=Mozilla Developer Network|access-date=9 February 2016}}</ref>
प्रोटोटाइप-आधारित लेन्गवेज ओं के विरुद्ध  एक आम आलोचना यह है कि जावास्क्रिप्ट की लोकप्रियता और बाजार में प्रवेश के बावजूद [[सॉफ्टवेयर डेवलपर]]्स का समुदाय उनसे अपरिचित है। प्रोटोटाइप-आधारित प्रणाली का यह ज्ञान स्तर [[जावास्क्रिप्ट ढांचा]] के प्रसार और [[वर्ल्ड वाइड वेब]] के परिपक्व होने के साथ जावास्क्रिप्ट के जटिल उपयोग के साथ बढ़ रहा है।<ref>{{Cite news|url=https://alistapart.com/article/prototypal-object-oriented-programming-using-javascript|title=Prototypal Object-Oriented Programming using JavaScript|date=2016-04-26|work=A List Apart|access-date=2018-10-21|language=en-US}}</ref>{{citation needed|date=March 2013}} ईसीएमएस्क्रिप्ट 6 ने जावास्क्रिप्ट के सम्मलित  ा प्रोटोटाइप-आधारित इनहेरिटेंस पर [[सिंटैक्टिक चीनी]] के रूप में कक्षाएं प्रस्तुत  कीं, ऑब्जेक्ट ओं को बनाने और इनहेरिटेंस से निपटने का एक वैकल्पिक विधियो  प्रदान किया।<ref>{{cite web|title=कक्षाओं|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/कक्षाओं|website=JavaScript reference|publisher=Mozilla Developer Network|access-date=9 February 2016}}</ref>





Revision as of 23:18, 19 February 2023

प्रोटोटाइप आधारित प्रोग्रामिंग ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की एक शैली होती है, जिसमें प्रोटोटाइप के रूप में काम करने वाली उपलब्ध ऑब्जेक्ट ओं का पुन: उपयोग करने की प्रक्रिया के माध्यम से इनहेरिटेंस प्रोग्रामिंग के रूप मेंजाना जाता है और जो प्रोटोटाइप के रूप में कार्य करता है। इस मॉडल को प्रोटोटाइप, प्रोटोटाइप-ओरिएंटेड क्लासलेस, या इंस्टेंस-आधारित प्रोग्रामिंग के रूप में भी जाना जाता है।

प्रोटोटाइप-आधारित प्रोग्रामिंग सामान्यीकृत ऑब्जेक्ट ओं की प्रक्रिया का उपयोग करती है, जिसे बाद में क्लोन और विस्तारित किया जाता है। एक उदाहरण के रूप में फ्रूट का उपयोग फ्रूट के गुणों और सामान्य रूप में फ्रूट की कार्यक्षमता का प्रतिनिधित्व करता है। एक बनाना की ऑब्जेक्ट को फ्रूट की ऑब्जेक्ट से क्लोन किया जाता है और केलों के लिए विशिष्ट सामान्य गुणों को जोड़ा जाता है। प्रत्येक व्यक्ति बनाना की ऑब्जेक्ट को सामान्य बनाना से क्लोन किया जाता है। और कक्षा आधारित पैराडाइम प्रोग्रामिंग से तुलना करने पर, जहाँ एक फ्रूट क्लास को बनाना के क्लास द्वारा विस्तारित किया जाता है।

पहली प्रोटोटाइप-ओरिएंटेड प्रोग्रामिंग लैंग्वेज स्वयं (प्रोग्रामिंग लेन्गवेज ) के रूप में थी, जिसे 1980 के दशक के मध्य में डेविड अनगर और रान्डेल स्मिथ द्वारा ऑब्जेक्ट-ओरिएंटेड लैंग्वेज डिज़ाइन के विषयों पर शोध करने के लिए विकसित किया गया था। 1990 के दशक के उत्तरार्ध से, वर्गहीन प्रतिमान तेजी से लोकप्रिय हो गया है। कुछ वर्तमान प्रोटोटाइप-उन्मुख लेन्गवेज एँ जावास्क्रिप्ट और अन्य एकमा स्क्रिप्ट कार्यान्वयन इस रूप में होती है जैसे, जावास्क्रिप्ट और एडोब फ्लैश का एक्शन स्क्रिप्ट 1.0, लुआ प्रोग्रामिंग लेन्गवेज , सेसिल प्रोग्रामिंग लेन्गवेज , न्यूटनस्क्रिप्ट, आईओ प्रोग्रामिंग लेन्गवेज , आईओकइ प्रोग्रामिंग लेन्गवेज , एमओओ प्रोग्रामिंग लेन्गवेज , रेबोल और ऑटोहोट्की इत्यादि रूप में होती है।

डिजाइन और कार्यान्वयन

जावास्क्रिप्ट में प्रोटोटाइप इनहेरिटेंस का वर्णन डगलस क्रॉकफोर्ड द्वारा किया गया है

यदि आप प्रोटोटाइप ऑब्जेक्ट बनाते हैं और फिर नए इंस्टैंसेस बनाते हैं। तो ऑब्जेक्ट जावास्क्रिप्ट में परिवर्तनशील रूप में होती हैं, इसलिए हम उन नए उदाहरणों की वृद्धि कर सकते हैं, उन्हें नए क्षेत्रों और नई विधियाँ द्वारा उपलब्ध करा सकते हैं। ये तब भी नए ऑब्जेक्ट्स के लिए प्रोटोटाइप के रूप में कार्य कर सकती हैं। हमें बहुत से समान ऑब्जेक्ट्स को बनाने के लिए कक्षाओं की आवश्यकता नहीं होती है, इनहेरिटेंस बेस क्लास से नई क्लास बनाने की प्रक्रिया है। इससे अधिक वस्तु उन्मुख क्या हो सकती है

प्रोटोटाइप-आधारित प्रोग्रामिंग के अधिवक्ताओं का आशय है कि यह प्रोग्रामर को उदाहरणों के कुछ सेट के व्यवहार पर ध्यान केंद्रित करने के लिए प्रोत्साहित करता है और बाद में इन ऑब्जेक्ट ओं को आर्किटेपल ऑब्जेक्ट्स में वर्गीकृत करने के बारे में चिंता करता है जो बाद में क्लास (प्रोग्रामिंग) के समान फैशन में उपयोग किए जाते हैं।[1] कई प्रोटोटाइप-आधारित प्रणालियाँ रन टाइम प्रोग्राम जीवनचक्र चरण के समय प्रोटोटाइप के परिवर्तन को प्रोत्साहित करती हैं, जबकि बहुत कम क्लास-आधारित ऑब्जेक्ट-ओरिएंटेड प्रणाली जैसे डायनेमिक ऑब्जेक्ट-ओरिएंटेड प्रणाली , सामान्य लिस्प, डायलन प्रोग्रामिंग लैंग्वेज, ऑब्जेक्टिव सी, पर्ल, पायथन प्रोग्रामिंग लैंग्वेज, रूबी प्रोग्रामिंग लेन्गवेज , या स्मॉलटाक, किसी प्रोग्राम के निष्पादन के समय कक्षाओं को बदलने की अनुमति देते हैं।

लगभग सभी प्रोटोटाइप-आधारित प्रणालियाँ व्याख्याकृत और गतिशील रूप से टाइप की गई लेन्गवेज ओं पर आधारित होती है। चूंकि , वैधानिक रूप से टाइप की गई लेन्गवेज ओं पर आधारित प्रणालियाँ प्रौद्योगिकी रूप से व्यवहार्य होती है। ओमेगा की वेबसाइट पर वाद विवाद की गई है[2] ओमेगा की लेन्गवेज इस प्रकार की प्रणाली का उदाहरण है, चूंकि ओमेगा की वेबसाइट के अनुसार यह स्थिर नहीं है बल्कि यह संभव है कि वह ओमेगा को स्टेटिक बाइंडिंग के रूप में उपयोग कर सकता है, जहां यह संभव है और यह एक प्रोग्राम की कार्यक्षमता में सुधार कर सकता है।

ऑब्जेक्ट निर्माण

प्रोटोटाइप-आधारित लेन्गवेज ओं में स्पष्ट क्लास नहीं होते हैं। ऑब्जेक्ट एक प्रोटोटाइप गुण के माध्यम से अन्य ऑब्जेक्ट ओं से सीधे प्राप्त होते हैं। प्रोटोटाइप गुण को स्वयं और जावास्क्रिप्ट में प्रोटोटाइप या आईओ में प्रोटो कहा जाता है। नई ऑब्जेक्ट ओं के निर्माण की दो विधियाँ होती है पूर्व निहिलो ऑब्जेक्ट निर्माण से किसी सम्मलित ऑब्जेक्ट की क्लोनिंग के माध्यम से होती है और पूर्व ऑब्जेक्ट लिटरल कंप्यूटर प्रोग्रामिंग के कुछ रूपों के माध्यम से समर्थित किया जाता है और घोषणाएं जहां ऑब्जेक्ट ओं को रनटाइम पर विशेष सिंटैक्स के माध्यम से परिभाषित किया जा सकता है जैसे {...} और सीधे एक चर के पास गया। जबकि अधिकांश प्रणालियाँ विभिन्न प्रकार के क्लोनिंग का समर्थन करती हैं, पूर्व निहिलो ऑब्जेक्ट का निर्माण उतना महत्वपूर्ण नहीं है।[3]

क्लास-आधारित लेन्गवेज ओं में, एक क्लास के कंस्ट्रक्टर (कंप्यूटर साइंस) के माध्यम से एक नया उदाहरण बनाया जाता है, एक विशेष फलन जो ऑब्जेक्ट के सदस्यों (गुणों और विधियों) के लिए मेमोरी का एक ब्लॉक आरक्षित करता है और उस ब्लॉक का संदर्भ देता है। कन्स्ट्रक्टर पैरामीटर कंप्यूटर साइंस का एक वैकल्पिक सेट फलन में पारित किया जाता है और सामान्यतः गुणों में आयोजित किया जाता है। परिणामी उदाहरण क्लास में परिभाषित सभी विधियों और गुणों को इनहेरिट करता है, जो एक प्रकार के टेम्पलेट के रूप में कार्य करता है जिससे समान टाइप की गई ऑब्जेक्ट ओं का निर्माण किया जाता है।

प्रणाली जो पूर्व निहिलो ऑब्जेक्ट निर्माण का समर्थन करते हैं, सम्मलित प्रोटोटाइप से क्लोनिंग के बिना नई ऑब्जेक्ट ओं को खरोंच से बनाने की अनुमति देते हैं। ऐसी प्रणालियाँ सम्मलित ऑब्जेक्ट ओं को संदर्भित किए बिना नई ऑब्जेक्ट ओं के गुणों और व्यवहारों को निर्दिष्ट करने के लिए एक विशेष सिंटैक्स प्रदान करती हैं। कई प्रोटोटाइप लेन्गवेज ओं में एक रूट ऑब्जेक्ट सम्मलित होता है, जिसे अधिकांशतः ऑब्जेक्ट कहा जाता है, जिसे रन-टाइम में बनाए गए अन्य सभी ऑब्जेक्ट्स के लिए डिफ़ॉल्ट प्रोटोटाइप के रूप में सेट किया जाता है और जिसमें सामान्य रूप से आवश्यक विधि होते हैं जैसे कि टूस्ट्रिंग() एक स्ट्रिंग के रूप में ऑब्जेक्ट का विवरण वापस करने के लिए कार्य के रूप में होता है। पूर्व निहिलो ऑब्जेक्ट निर्माण का एक उपयोगी पहलू यह सुनिश्चित करता है कि एक नए ऑब्जेक्ट के स्लॉट गुण और विधियाँ के नाम में शीर्ष-स्तरीय ऑब्जेक्ट के साथ नेम स्पेस का विरोध नहीं करती है। जावास्क्रिप्ट लेन्गवेज में, कोई शून्य प्रोटोटाइप का उपयोग कर ऐसा कर सकता है, अर्थात उदाहरण कुछ इस प्रकार है, Object.create(null).)

क्लोनिंग एक ऐसी प्रक्रिया को संदर्भित करता है जिससे किसी सम्मलित ऑब्जेक्ट उसके प्रोटोटाइप के व्यवहार की नकल करके एक नई ऑब्जेक्ट का निर्माण किया जाता है। नई ऑब्जेक्ट तब मूल के सभी गुणों को वहन करती है। इस बिंदु से, नई ऑब्जेक्ट को संशोधित किया जाता है। कुछ प्रणालियों में परिणामी चाइल्ड ऑब्जेक्ट अपने प्रोटोटाइप के लिए एक स्पष्ट लिंक डेलिगेशन ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग या समानता (प्रोग्रामिंग) के माध्यम से बनाए रखता है और प्रोटोटाइप में बदलाव के कारण इसके क्लोन में स्पष्ट परिवर्तन होते हैं। अन्य प्रणालियाँ, जैसे फोर्थ (प्रोग्रामिंग लेन्गवेज) केवो (प्रोग्रामिंग लेन्गवेज ), इस प्रकार से प्रोटोटाइप से परिवर्तन को प्रत्यक्ष नहीं करती हैं और इसके अतिरिक्त एक अधिक सुसंगत मॉडल का पालन करती हैं, जहाँ क्लोन ऑब्जेक्ट्स में परिवर्तन स्वचालित रूप से तनय में नहीं फैलते हैं।[1]

// Example of true prototypal inheritance style

// in JavaScript.

// object creation using the literal // object notation {}.

const foo = { name: "foo", one: 1, two: 2 };

// Another object. const bar = { two: "two", three: 3 };

// Object.setPrototypeOf() is a method introduced in ECMAScript 2015. // For the sake of simplicity, let us pretend // that the following line works regardless of the

// engine used: Object.setPrototypeOf(bar, foo); // foo is now the prototype of bar.

// If we try to access foo's properties from bar

// from now on, we'll succeed. bar.one; // Resolves to 1.

// The child object's properties are also accessible. bar.three; // Resolves to 3.

// Own properties shadow prototype properties bar.two; // Resolves to "two"

bar.name; // unaffected, resolves to "foo" foo.name; // Resolves to "foo"

दूसरे उदाहरण के लिए:

const foo = { one: 1, two: 2 };

// bar.prototype = foo const bar = Object.create(foo);

bar.three = 3;

bar.one; // 1 bar.two; // 2 bar.three; // 3

प्रतिनिधिमंडल

प्रोटोटाइप-आधारित लेन्गवेज में जो प्रत्यायोजन का उपयोग करती हैं, लेन्गवेज रनटाइम गतिशील प्रेषण सही विधि या डेटा का सही भाग खोजने में सक्षम होती है, . केवल प्रतिनिधिमंडल की एक श्रृंखला का अनुसरण करके उद्देश्य से इसके प्रतिरूप तक जब तक मिलान पाया जाता है.इस व्यवहार को ऑब्जेक्ट ओं के बीच स्थापित करने के लिए डेलिगेशन पॉइंटर की जरूरत होती है। क्लास-आधारित ऑब्जेक्ट-ओरिएंटेड लेन्गवेज में क्लास और इंस्टेंस के बीच संबंध के विपरीत प्रोटोटाइप और उसके ऑफशूट के बीच संबंध के लिए यह आवश्यक नहीं है कि चाइल्ड ऑब्जेक्ट में इस लिंक से परे प्रोटोटाइप के लिए मेमोरी या संरचनात्मक समानता हो। जैसे, क्लास-आधारित प्रणाली के रूप में इसके संबंधित प्रोटोटाइप की संरचना को पुनर्व्यवस्थित किए बिना समय के साथ चाइल्ड ऑब्जेक्ट को संशोधित करना जारी रखा जाता है। यह जानना भी महत्वपूर्ण है कि न केवल डेटा, अपितु विधियों को भी जोड़ा या बदला जा सकता है। इस कारण से, कुछ प्रोटोटाइप-आधारित लेन्गवेज डेटा और विधियों दोनों को स्लॉट या सदस्य के रूप में संदर्भित करती हैं।

संयोजन

समसामयिक प्रोटोटाइप में केवो प्रोग्रामिंग लेन्गवेज द्वारा कार्यान्वित दृष्टिकोण मूल प्रोटोटाइप के लिए कोई दृश्य संकेत या लिंक के रूप में नहीं होती है, जिससे किसी ऑब्जेक्ट का क्लोन बनाया जाता है। प्रोटोटाइप (पैरेंट) ऑब्जेक्ट को लिंक करने के अतिरिक्त कॉपी किया गया है और कोई डेलिगेशन नहीं है। परिणामस्वरुप, क्लोन किए गए ऑब्जेक्ट्स में प्रोटोटाइप में परिवर्तन दिखाई नहीं देते है।[4]

इस व्यवस्था के अनुसार मुख्य वैचारिक अंतर यह है कि प्रोटोटाइप ऑब्जेक्ट में किए गए परिवर्तन स्वचालित रूप से क्लोन के लिए प्रचारित नहीं होते हैं। इसे लाभ या नुकसान के रूप में देखा जा सकता है। चूंकि, केवो समानता के आधार पर ऑब्जेक्ट ओं के सेट में परिवर्तन प्रकाशित करने के लिए अतिरिक्त प्राचीन रूप प्रदान करता है, तथाकथित पारिवारिक समानताएं या क्लोन परिवार तंत्र[4] के आधार पर ऑब्जेक्ट ओं के समूहों में परिवर्तनों के प्रकाशन के लिए अतिरिक्त प्राइमाइज प्रदान करता है। यह भी कभी-कभी प्रमाणित किया जाता है कि प्रतिनिधिमंडल-आधारित प्रोटोटाइप में एक अतिरिक्त नुकसान होता है, जो कि चाइल्ड की ऑब्जेक्ट में परिवर्तन पैरेंट के बाद के संचालन को प्रभावित करता है। चूंकि, यह समस्या प्रतिनिधिमंडल-आधारित मॉडल में निहित नहीं होती है और जावास्क्रिप्ट जैसी प्रतिनिधिमंडल आधारित लेन्गवेज में सम्मलित नहीं होती है, जो यह सुनिश्चित करती है कि चाइल्ड ऑब्जेक्ट में परिवर्तन निरंतर चाइल्ड ऑब्जेक्ट में ही रिकॉर्ड किए जाते हैं और पैरेंट में कभी नहीं अर्थात चाइल्ड के मूल्य पैरेंट के मूल्य को बदलने के अतिरिक्त पैरेंट के मूल्य को छाया प्रदान करता है।

सरल कार्यान्वयन में, समवर्ती प्रोटोटाइप में प्रतिनिधिमंडल आधारित प्रोटोटाइप की तुलना में तेज़ सदस्य लुकअप रूप में होता है क्योंकि मूल ऑब्जेक्ट की श्रृंखला का पालन करने की कोई आवश्यकता नहीं होती है, लेकिन इसके विपरीत अधिक मेमोरी का उपयोग करता है, क्योंकि पैरेंट ऑब्जेक्ट की ओर इशारा करते हुए एकल स्लॉट होने के अतिरिक्त सभी स्लॉट कॉपी किए जाते हैं। चूंकि, अधिक परिष्कृत कार्यान्वयन इस समस्या से बच सकते हैं, चूंकि गति और स्मृति के बीच व्यापार बंद की आवश्यकता होती है। उदाहरण के लिए, समसामयिक प्रोटोटाइप वाली प्रणालियाँ पर्दे के पीछे के डेटा साझा करने की अनुमति देने के लिए लेखन कार्यान्वयन का उपयोग करती हैं और इस प्रकार के दृष्टिकोण का वास्तव में केवो द्वारा पालन किया जाता है।[5] इसके विपरीत, डेलिगेशन-आधारित प्रोटोटाइप वाले प्रणाली डेटा लुकअप को गति देने के लिए कैशिंग (कंप्यूटिंग) का उपयोग करते हैं।

आलोचना

क्लास-आधारित ऑब्जेक्ट मॉडल के पैरोकार जो प्रोटोटाइप-आधारित प्रणाली की आलोचना करते हैं, अधिकांशतः उन चिंताओं के समान होते हैं जो प्रोग्रामिंग लेन्गवेज ओं के लिए स्टैटिक टाइप प्रणाली के समर्थकों के पास डायनेमिक टाइप प्रणाली होते हैं (डेटा प्रकार देखें)। सामान्यतः , ऐसी चिंताओं में शुद्धता (कंप्यूटर विज्ञान), प्रकार की सुरक्षा, पूर्वानुमेयता, एल्गोरिथम दक्षता और प्रोग्रामर अपरिचितता सम्मलित होती है।

पहले तीन बिंदुओं पर, कक्षाओं को अधिकांशतः प्रकारों के अनुरूप देखा जाता है (अधिकांश वैधानिक रूप से टाइप की गई ऑब्जेक्ट -उन्मुख लेन्गवेज ओं में वे उस भूमिका को पूरा करते हैं) और उनके उदाहरणों और उनके उदाहरणों के उपयोगकर्ताओं को संविदात्मक गारंटी प्रदान करने का प्रस्ताव है, कि वे व्यवहार करेंगे किसी दिए गए फैशन में।

दक्षता के संबंध में, कक्षाएं घोषित करना कई संकलक अनुकूलन को सरल करता है जो कुशल विधि और उदाहरण-चर लुकअप को विकसित करने की अनुमति देता है। स्व (प्रोग्रामिंग लेन्गवेज ) लेन्गवेज के लिए, प्रोटोटाइप-आधारित प्रणाली बनाम क्लास-आधारित प्रणाली के प्रदर्शन को बहुत अच्छा बनाने के लिए तकनीकों के विकास, संकलन और व्याख्या पर बहुत अधिक समय व्यतीत किया गया था।

प्रोटोटाइप-आधारित लेन्गवेज ओं के विरुद्ध एक आम आलोचना यह है कि जावास्क्रिप्ट की लोकप्रियता और बाजार में प्रवेश के बावजूद सॉफ्टवेयर डेवलपर्स का समुदाय उनसे अपरिचित है। प्रोटोटाइप-आधारित प्रणाली का यह ज्ञान स्तर जावास्क्रिप्ट ढांचा के प्रसार और वर्ल्ड वाइड वेब के परिपक्व होने के साथ जावास्क्रिप्ट के जटिल उपयोग के साथ बढ़ रहा है।[6][citation needed] ईसीएमएस्क्रिप्ट 6 ने जावास्क्रिप्ट के सम्मलित ा प्रोटोटाइप-आधारित इनहेरिटेंस पर सिंटैक्टिक चीनी के रूप में कक्षाएं प्रस्तुत कीं, ऑब्जेक्ट ओं को बनाने और इनहेरिटेंस से निपटने का एक वैकल्पिक विधियो प्रदान किया।[7]


प्रोटोटाइप-आधारित प्रोग्रामिंग का समर्थन करने वाली लेन्गवेज एं


यह भी देखें

संदर्भ

  1. 1.0 1.1 Taivalsaari, Antero (1996). "Section 1.1". Classes vs. Prototypes: Some Philosophical and Historical Observations. pp. 44–50. CiteSeerX 10.1.1.56.4713.
  2. Blaschek, Günther. "Section 2.8". Omega: Statically Typed Prototypes. p. 177.
  3. Dony, Chistophe; Malenfan, Jacques; Bardou, Daniel. "Section 1.2" (PDF). Classifying Prototype-based Programming Languages. p. 17.
  4. 4.0 4.1 Antero Taivalsaar (2009). "Simplifying JavaScript with Concatenation-Based Prototype Inheritance" (PDF) (in English). Tampere University of Technology. Archived from the original on 2009. Retrieved 2015-03-11. Kevo implemented a pure concatenation-based object model in which new objects were created by copying and the namespaces of all the objects were always fully self-contained. … Furthermore, Kevo had an internal clone family mechanism that made it possible to track the "genealogy" of changes among groups of objects, so that changes to individual objects could be propagated to other objects when necessary. {{cite web}}: Check date values in: |archive-date= (help)
  5. Taivalsaari, Antero (1992). "Kevo, a prototype-based object-oriented programming language based on concatenation and module operations". Technical Report Report LACIR 92-02. University of Victoria.
  6. "Prototypal Object-Oriented Programming using JavaScript". A List Apart (in English). 2016-04-26. Retrieved 2018-10-21.
  7. "कक्षाओं". JavaScript reference. Mozilla Developer Network. Retrieved 9 February 2016.
  8. Proprietary scripting language. http://www.davidbrebner.com/?p=4 has some basic examples of use.


अग्रिम पठन