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

From Vigyanwiki
No edit summary
No edit summary
 
(11 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Short description|Style of object-oriented programming in which inheritance is based on reusing objects}}
{{Short description|Style of object-oriented programming in which inheritance is based on reusing objects}}
{{Distinguish|प्रोटोटाइप पैटर्न या |सॉफ्टवेयर प्रोटोटाइप के रूप में होते है।}}
[[प्रोटोटाइप]] आधारित प्रोग्रामिंग [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] की एक शैली होती है, जिसमें प्रोटोटाइप के रूप में काम करने वाली उपलब्ध [[वस्तुओं|ऑब्जेक्ट ओं]] का पुन: उपयोग करने की प्रक्रिया के माध्यम से इनहेरिटेंस प्रोग्रामिंग के रूप मेंजाना जाता है और जो प्रोटोटाइप के रूप में कार्य करता है। इस मॉडल को प्रोटोटाइप, प्रोटोटाइप-ओरिएंटेड क्लासलेस, या इंस्टेंस-आधारित प्रोग्रामिंग के रूप में भी जाना जाता है।
{{Programming paradigms}}
[[प्रोटोटाइप]]-आधारित प्रोग्रामिंग [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] की एक शैली होती है, जिसमें प्रोटोटाइप के रूप में काम करने वाली उपलब्ध [[वस्तुओं]] का पुन: उपयोग करने की प्रक्रिया के माध्यम से इनहेरिटेंस प्रोग्रामिंग के रूप मेंजाना जाता है और जो प्रोटोटाइप के रूप में कार्य करता है। इस मॉडल को प्रोटोटाइप, प्रोटोटाइप-ओरिएंटेड क्लासलेस, या इंस्टेंस-आधारित प्रोग्रामिंग के रूप में भी जाना जाता है।


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


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


== डिजाइन और कार्यान्वयन ==
== डिजाइन और कार्यान्वयन ==
जावास्क्रिप्ट में प्रोटोटाइप विरासत का वर्णन [[डगलस क्रॉकफोर्ड]] द्वारा किया गया है
जावास्क्रिप्ट में प्रोटोटाइप इनहेरिटेंस का वर्णन [[डगलस क्रॉकफोर्ड]] द्वारा किया गया है
  {{Quote
   
|You make prototype objects, and then … make new instances. Objects are mutable in JavaScript, so we can augment the new instances, giving them new fields and methods. These can then act as prototypes for even newer objects. We don't need classes to make lots of similar objects… Objects inherit from objects. What could be more object oriented than that?<ref>{{cite web|last=Crockford|first=Douglas|title=Prototypal Inheritance in JavaScript|url=http://crockford.com/javascript/prototypal.html|access-date=22 June 2021}}</ref>
{{Quote
}}
|यदि आप प्रोटोटाइप ऑब्जेक्ट बनाते हैं और फिर नए इंस्टैंसेस बनाते हैं। तो ऑब्जेक्ट जावास्क्रिप्ट में परिवर्तनशील रूप में  होती हैं, इसलिए हम उन नए उदाहरणों की वृद्धि कर सकते हैं, उन्हें नए क्षेत्रों और नई विधियाँ  द्वारा उपलब्ध करा सकते हैं। ये तब भी नए ऑब्जेक्ट्स के लिए प्रोटोटाइप के रूप में कार्य कर सकती हैं। हमें बहुत से समान ऑब्जेक्ट्स को बनाने के लिए कक्षाओं की आवश्यकता नहीं होती है, इनहेरिटेंस बेस क्लास से नई क्लास बनाने की प्रक्रिया है। इससे अधिक वस्तु उन्मुख क्या हो सकती है}}
प्रोटोटाइप-आधारित प्रोग्रामिंग के अधिसमय ाओं का तर्क है कि यह प्रोग्रामर को उदाहरणों के कुछ सेट के व्यवहार पर ध्यान केंद्रित करने के लिए प्रोत्साहित करता है और केवल बाद में इन वस्तुओं को आर्किटेपल ऑब्जेक्ट्स में वर्गीकृत करने के बारे में चिंता करता है जो बाद में [[वर्ग (प्रोग्रामिंग)|क्लास (प्रोग्रामिंग)]] के समान फैशन में उपयोग किए जाते हैं।<ref name="Taivalsaari"/>  कई प्रोटोटाइप-आधारित प्रणालियाँ रन टाइम (प्रोग्राम जीवनचक्र चरण) | रन-टाइम के समय  प्रोटोटाइप के परिवर्तन को प्रोत्साहित करती हैं, जबकि केवल बहुत कम वर्ग-आधारित ऑब्जेक्ट-ओरिएंटेड सिस्टम (जैसे डायनेमिक ऑब्जेक्ट-ओरिएंटेड सिस्टम, [[सामान्य लिस्प]], डायलन (प्रोग्रामिंग) लैंग्वेज), [[उद्देश्य सी]], [[पर्ल]], पायथन (प्रोग्रामिंग लैंग्वेज), [[रूबी (प्रोग्रामिंग भाषा)]], या स्मॉलटाक) किसी प्रोग्राम के निष्पादन के समय  कक्षाओं को बदलने की अनुमति देते हैं।


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


== वस्तु निर्माण ==
लगभग सभी प्रोटोटाइप-आधारित प्रणालियाँ [[व्याख्या की गई भाषा|व्याख्याकृत]] और गतिशील रूप से टाइप की गई लेन्गवेज ओं पर आधारित होती है। चूंकि , वैधानिक रूप से टाइप की गई लेन्गवेज ओं पर आधारित प्रणालियाँ प्रौद्योगिकी रूप से व्यवहार्य होती है। ओमेगा की वेबसाइट पर वाद विवाद की गई है<ref>{{cite book | chapter = Section 2.8 | page = 177 | first = Günther | last = Blaschek | title = Omega: Statically Typed Prototypes }}</ref> ओमेगा की लेन्गवेज इस प्रकार की प्रणाली का उदाहरण है, चूंकि ओमेगा की वेबसाइट के अनुसार यह स्थिर नहीं है बल्कि यह संभव है कि वह ओमेगा को स्टेटिक बाइंडिंग के रूप में उपयोग कर सकता है, जहां यह संभव है और यह एक प्रोग्राम की कार्यक्षमता में सुधार कर सकता है।
प्रोटोटाइप-आधारित भाषाओं में स्पष्ट क्लास नहीं होते हैं। ऑब्जेक्ट एक प्रोटोटाइप संपत्ति के माध्यम से अन्य वस्तुओं से सीधे प्राप्त होते हैं। प्रोटोटाइप संपत्ति कहा जाता है <code>prototype</code> स्व (प्रोग्रामिंग भाषा) और जावास्क्रिप्ट में, या <code>proto</code> आईओ (प्रोग्रामिंग भाषा) में। नई वस्तुओं के निर्माण की दो विधियाँ हैं: पूर्व निहिलो (कुछ नहीं से) वस्तु निर्माण या किसी सम्मलित  ा वस्तु की क्लोनिंग के माध्यम से। पूर्व को ऑब्जेक्ट लिटरल (कंप्यूटर प्रोग्रामिंग) के कुछ रूपों के माध्यम से समर्थित किया जाता है, घोषणाएं जहां वस्तुओं को रनटाइम पर विशेष सिंटैक्स के माध्यम से परिभाषित किया जा सकता है जैसे <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>toString()</code> एक स्ट्रिंग के रूप में वस्तु का विवरण वापस करने के लिए कार्य। पूर्व निहिलो ऑब्जेक्ट निर्माण का एक उपयोगी पहलू यह सुनिश्चित करना है कि एक नए ऑब्जेक्ट के स्लॉट (गुण और विधियाँ) के नाम में शीर्ष-स्तरीय ऑब्जेक्ट ऑब्जेक्ट के साथ [[नाम स्थान]] का विरोध नहीं है। (जावास्क्रिप्ट भाषा में, कोई शून्य प्रोटोटाइप का उपयोग कर ऐसा कर सकता है, अर्थात । <code>Object.create(null)</code>.)
== ऑब्जेक्ट निर्माण ==
प्रोटोटाइप-आधारित लेन्गवेज ओं में स्पष्ट क्लास नहीं होते हैं। ऑब्जेक्ट एक प्रोटोटाइप गुण के माध्यम से अन्य ऑब्जेक्ट ओं से सीधे प्राप्त होते हैं। प्रोटोटाइप गुण को सेल्फ और जावास्क्रिप्ट में प्रोटोटाइप या आईओ में प्रोटो कहा जाता है। नई ऑब्जेक्ट ओं के निर्माण की दो विधियाँ होती है पूर्व निहिलो ऑब्जेक्ट निर्माण से किसी सम्मलित ऑब्जेक्ट की क्लोनिंग के माध्यम से होती है और पूर्व ऑब्जेक्ट लिटरल कंप्यूटर प्रोग्रामिंग के कुछ रूपों के माध्यम से समर्थित किया जाता है और घोषणाएं जहां ऑब्जेक्ट ओं को रनटाइम पर विशेष सिंटैक्स के माध्यम से परिभाषित किया जा सकता है जैसे <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>


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


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


// दूसरी वस्तु।
क्लोनिंग एक ऐसी प्रक्रिया को संदर्भित करता है जिससे किसी सम्मलित ऑब्जेक्ट उसके प्रोटोटाइप के व्यवहार की नकल करके एक नई ऑब्जेक्ट का निर्माण किया जाता है। नई ऑब्जेक्ट तब मूल के सभी गुणों को वहन करती है। इस बिंदु से, नई ऑब्जेक्ट को संशोधित किया जाता है। कुछ प्रणालियों में परिणामी चाइल्ड ऑब्जेक्ट अपने प्रोटोटाइप के लिए एक स्पष्ट लिंक डेलिगेशन ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग या [[समानता (प्रोग्रामिंग)]] के माध्यम से बनाए रखता है और प्रोटोटाइप में बदलाव के कारण इसके क्लोन में स्पष्ट परिवर्तन होते हैं। अन्य प्रणालियाँ, जैसे [[फोर्थ (प्रोग्रामिंग भाषा)|फोर्थ (प्रोग्रामिंग लेन्गवेज)]] [[केवो (प्रोग्रामिंग भाषा)|केवो (प्रोग्रामिंग लेन्गवेज )]], इस प्रकार से प्रोटोटाइप से परिवर्तन को प्रत्यक्ष नहीं करती हैं और इसके अतिरिक्त एक अधिक सुसंगत मॉडल का पालन करती हैं, जहाँ क्लोन ऑब्जेक्ट्स में परिवर्तन स्वचालित रूप से तनय में नहीं फैलते हैं।<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>
कॉन्स्ट बार = {दो: दो, तीन: 3};


// Object.setPrototypeOf() ECMAScript 2015 में प्रारंभ  की गई एक विधि है।
// Example of true prototypal inheritance style
// सादगी के लिए, आइए हम दिखावा करें
// कि निम्न पंक्ति चाहे कुछ भी काम करे
// इंजन का उपयोग  किया:
Object.setPrototypeOf(बार, फू); // फू अब बार का प्रोटोटाइप है।


// यदि हम फू की संपत्तियों को बार से एक्सेस करने का प्रयास करते हैं
// in JavaScript.
// अब से, हम सफ्रूट  होंगे।
बार.एक; // 1 को हल करता है।


// चाइल्ड ऑब्जेक्ट के गुण भी एक्सेस किए जा सकते हैं।
// object creation using the literal
बार.तीन; // 3 को हल करता है।
// 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"


दूसरे उदाहरण के लिए:
दूसरे उदाहरण के लिए:
<वाक्यविन्यास हाइलाइट लैंग = जावास्क्रिप्ट>
कॉन्स्ट फू = {एक: 1, दो: 2};


// bar.prototype = foo
const foo = { one: 1, two: 2 };
कॉन्स्ट बार = ऑब्जेक्ट.क्रिएट (फू);


बार.तीन = 3;
// bar.[[prototype]] = foo const bar = Object.create(foo);


बार.एक; // 1
bar.three = 3;
बार.दो; // 2
बार.तीन; // 3
</वाक्यविन्यास हाइलाइट>


bar.one; // 1 bar.two; // 2 bar.three; // 3
== प्रतिनिधिमंडल ==
== प्रतिनिधिमंडल ==
प्रोटोटाइप-आधारित भाषाओं में जो प्रत्यायोजन का उपयोग करती हैं, भाषा रनटाइम [[गतिशील प्रेषण]] सही विधि या डेटा का सही टुकड़ा खोजने में सक्षम है, जब तक कि एक मैच नहीं मिल जाता है, तब तक डेलिगेशन पॉइंटर्स (ऑब्जेक्ट से उसके प्रोटोटाइप तक) की एक श्रृंखला का पालन करते हैं। वस्तुओं के बीच इस व्यवहार-साझाकरण को स्थापित करने के लिए जो कुछ भी आवश्यक है वह प्रतिनिधिमंडल सूचक है। क्लास-आधारित ऑब्जेक्ट-ओरिएंटेड भाषाओं में क्लास और इंस्टेंस के बीच संबंध के विपरीत, प्रोटोटाइप और उसके ऑफशूट के बीच संबंध के लिए यह आवश्यक नहीं है कि चाइल्ड ऑब्जेक्ट में इस लिंक से परे प्रोटोटाइप के लिए मेमोरी या संरचनात्मक समानता हो। जैसे, क्लास-आधारित सिस्टम के रूप में इसके संबंधित प्रोटोटाइप की संरचना को पुनर्व्यवस्थित किए बिना समय के साथ चाइल्ड ऑब्जेक्ट को संशोधित और संशोधित करना जारी रखा जा सकता है। यह भी ध्यान रखना महत्वपूर्ण है कि न केवल डेटा, अपितु विधियों को भी जोड़ा या बदला जा सकता है। इस कारण से, कुछ प्रोटोटाइप-आधारित भाषाएँ डेटा और विधियों दोनों को स्लॉट या सदस्य के रूप में संदर्भित करती हैं।{{Citation needed|reason=Sentence needs at least 1 citation. I've coded professionally in JS(all variants) & ActionScript for 4 years, and I've NEVER seen "slots" used this way in JS, and rarely in AS. E.g. see inconsistent/nonexistent usage in following: [http://www.google.com/#q=javascript+methods+properties+slots&hl=en&pws=0&biw=1247&bih=673&site=webhp&fp=528dfc887ad8eb4a&bav=on.2,or.r_gc.r_pw.,cf.osb&cad=b] & [http://www.google.com/#q=actionscript+methods+properties+slots&hl=en&pws=0&biw=1247&bih=673&site=webhp&fp=1&bav=on.2,or.r_gc.r_pw.,cf.osb&cad=b] . I'm calling 'Citation-needing', if not 'Dubious'.|date=January 2012}}
प्रोटोटाइप-आधारित लेन्गवेज में जो प्रत्यायोजन का उपयोग करती हैं, लेन्गवेज रनटाइम [[गतिशील प्रेषण]] सही विधि या डेटा का सही भाग खोजने में सक्षम होती है, . केवल प्रतिनिधिमंडल की एक श्रृंखला का अनुसरण करके उद्देश्य से इसके प्रतिरूप तक जब तक मिलान पाया जाता है.इस व्यवहार को ऑब्जेक्ट ओं के बीच स्थापित करने के लिए डेलिगेशन पॉइंटर की जरूरत होती है। क्लास-आधारित ऑब्जेक्ट-ओरिएंटेड लेन्गवेज में क्लास और इंस्टेंस के बीच संबंध के विपरीत प्रोटोटाइप और उसके ऑफशूट के बीच संबंध के लिए यह आवश्यक नहीं है कि चाइल्ड ऑब्जेक्ट में इस लिंक से परे प्रोटोटाइप के लिए मेमोरी या संरचनात्मक समानता हो। जैसे, क्लास-आधारित प्रणाली के रूप में इसके संबंधित प्रोटोटाइप की संरचना को पुनर्व्यवस्थित किए बिना समय के साथ चाइल्ड ऑब्जेक्ट को संशोधित करना जारी रखा जाता है। यह जानना भी महत्वपूर्ण है कि न केवल डेटा, अपितु विधियों को भी जोड़ा या बदला जा सकता है। इस कारण से, कुछ प्रोटोटाइप-आधारित लेन्गवेज डेटा और विधियों दोनों को स्लॉट या सदस्य के रूप में संदर्भित करती हैं।
 
== संयोजन ==
समसामयिक प्रोटोटाइप में केवो प्रोग्रामिंग लेन्गवेज द्वारा कार्यान्वित दृष्टिकोण मूल प्रोटोटाइप के लिए कोई दृश्य संकेत या लिंक के रूप में नहीं होती है, जिससे किसी ऑब्जेक्ट का क्लोन बनाया जाता है। प्रोटोटाइप (पैरेंट) ऑब्जेक्ट को लिंक करने के अतिरिक्त कॉपी किया गया है और कोई डेलिगेशन नहीं है। परिणामस्वरुप, क्लोन किए गए ऑब्जेक्ट्स में प्रोटोटाइप में परिवर्तन दिखाई नहीं देते है।<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 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>{{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> ईसीएमएस्क्रिप्ट 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>




== प्रोटोटाइप-आधारित प्रोग्रामिंग का समर्थन करने वाली भाषाएं ==
 
== प्रोटोटाइप-आधारित प्रोग्रामिंग का समर्थन करने वाली लेन्गवेज ==
{{div col}}
{{div col}}
* [[अभिनेता-आधारित समवर्ती भाषा]] (ABCL): ABCL/1, ABCL/R, ABCL/R2, ABCL/c plus|ABCL/c+
* एक्टर-आधारित समवर्ती लैंग्वेज (ABCL): ABCL/1, ABCL/R, ABCL/R2, ABCL/c plus|ABCL/c+
* अगोरा (प्रोग्रामिंग भाषा)
* अगोरा (प्रोग्रामिंग लैंग्वेज)
* ऑटोहॉटकी
* ऑटोहॉटकी
* [[क्रेग चेम्बर्स]] की सेसिल (प्रोग्रामिंग भाषा) और [[डीजल (प्रोग्रामिंग भाषा)]]।
* सेसिल और डीजल क्रेग चेम्बर्स प्रोग्रामिंग लैंग्वेज।
* [[शीत सी]]
* कोल्ड सी लैंग्वेज
* [[कोला (सॉफ्टवेयर आर्किटेक्चर)]]
* कोला सॉफ्टवेयर आर्किटेक्चर
* सामान्य लिस्प
* सामान्य लिस्प
* [http://www.cyan-lang.org/ सियान]
* सियान
* ईसीएमएस्क्रिप्ट
* ईसीएमएस्क्रिप्ट
** ActionScript 1.0, Adobe Flash और [[Adobe Flex]] द्वारा उपयोग किया जाता है
** एक्शनस्क्रिप्ट1.0, एडोब फ्लैश और एडोब फ्लेक्स द्वारा उपयोग किया जाता है
** [[E4X]]
** इ4 एक्स
** जावास्क्रिप्ट
** जावास्क्रिप्ट
** जेस्क्रिप्ट
** जेस्क्रिप्ट
** [[टाइपप्रति]]
** टाइपस्क्रिप्ट
* आईओ (प्रोग्रामिंग भाषा)
* आईओ (प्रोग्रामिंग लैंग्वेज)
* इओके (प्रोग्रामिंग भाषा)
* इओके (प्रोग्रामिंग लैंग्वेज)
* [[जेसननेट (प्रोग्रामिंग भाषा)]]
* जेसननेट (प्रोग्रामिंग लैंग्वेज)
* लोगटॉक
* लोगटॉक
* [[एलपीसी (प्रोग्रामिंग भाषा)]]
* एलपीसी (प्रोग्रामिंग लैंग्वेज)
* लुआ (प्रोग्रामिंग भाषा)
* लुआ (प्रोग्रामिंग लैंग्वेज)
* [[M2000 दुभाषिया (प्रोग्रामिंग भाषा)]]
* एम2000 (प्रोग्रामिंग लैंग्वेज)
* [[मेपल (सॉफ्टवेयर)]]
* मेपल (सॉफ्टवेयर)
* एमओओ (प्रोग्रामिंग भाषा)
* एमओओ (प्रोग्रामिंग लैंग्वेज)
* [[नेको (प्रोग्रामिंग भाषा)]]
* नेको (प्रोग्रामिंग लैंग्वेज)
* न्यूटनस्क्रिप्ट
* न्यूटनस्क्रिप्ट
* [[निम (प्रोग्रामिंग भाषा)]]
* निम (प्रोग्रामिंग लैंग्वेज)
* [[निक्स पैकेज मैनेजर]]
* निक्स पैकेज मैनेजर
* [[वस्तु लिस्प]]
* ऑब्जेक्ट लिस्प
* [[बूंदा बांदी]]
* ओब्लिक
* [[ओमेगा (प्रोग्रामिंग भाषा)]]
* ओमेगा (प्रोग्रामिंग लैंग्वेज)
* [[OpenLaszlo]]
* ओपन लैज़लो
* पर्ल, क्लास :: प्रोटोटाइप मॉड्यूल के साथ
* पर्ल, क्लास :: प्रोटोटाइप मॉड्यूल के साथ
* पायथन (प्रोग्रामिंग भाषा) [https://github.com/airportyh/prototype.py प्रोटोटाइप.py] के साथ।
* पायथन (प्रोग्रामिंग लैंग्वेज) प्रोटोटाइप.पीवाई के साथ।
* [[आर (प्रोग्रामिंग भाषा)]], प्रोटो पैकेज के साथ
* आर (प्रोग्रामिंग लैंग्वेज), प्रोटो पैकेज के साथ
* रिबोल
* रिबोल
* [[लाल (प्रोग्रामिंग भाषा)]]
* रेड (प्रोग्रामिंग लैंग्वेज)
* रूबी (प्रोग्रामिंग भाषा)
* रूबी (प्रोग्रामिंग लैंग्वेज)
* स्वयं (प्रोग्रामिंग भाषा)
* सेल्फ (प्रोग्रामिंग लैंग्वेज)
* [[सेफ (प्रोग्रामिंग भाषा)]]
* सेफ (प्रोग्रामिंग लैंग्वेज)
* [[स्लेट (प्रोग्रामिंग भाषा)]]
* स्लेट (प्रोग्रामिंग लैंग्वेज)
* [[स्मार्टफ्रॉग]]
* स्मार्टफ्रॉग
* स्नैप!_(प्रोग्रामिंग_भाषा)|स्नैप!
* स्नैप (प्रोग्रामिंग लैंग्वेज)|
* [[Etoys (प्रोग्रामिंग भाषा)]]
* [[इटॉयस  (प्रोग्रामिंग लैंग्वेज)
* [[तब]]
* टेडस
* स्निट एक्सटेंशन के साथ [[टीसीएल]]
* स्निट एक्सटेंशन के साथ टीसीएल
* [[घोड़ा आदमी]]<ref>Proprietary scripting language. http://www.davidbrebner.com/?p=4 has some basic examples of use.</ref>
* उमाजिन
{{div col end}}
{{div col end}}


Line 141: Line 140:
== यह भी देखें ==
== यह भी देखें ==
* वर्ग-आधारित प्रोग्रामिंग (विपरीत)
* वर्ग-आधारित प्रोग्रामिंग (विपरीत)
* [[विभेदक वंशानुक्रम]]
* [[विभेदक वंशानुक्रम|डिफ्रेंशियल इनहेरिटेंस]]
* [[प्रोग्रामिंग प्रतिमान]]
* [[प्रोग्रामिंग प्रतिमान|पैराडिगम प्रोग्रामिंग लेन्गवेज]]  
* प्रोटो.आईओ
* प्रोटो.आईओ


Line 150: Line 149:


==अग्रिम पठन==
==अग्रिम पठन==
{{Wikibooks|Object oriented programming}}
* {{cite book|first=Martin|last=Abadi|author-link=Martin Abadi|author2=Luca Cardelli|author2-link=Luca Cardelli|title=A Theory of Objects|publisher=Springer-Verlag|year=1996|isbn=978-1-4612-6445-3}}
* {{cite book|first=Martin|last=Abadi|author-link=Martin Abadi|author2=Luca Cardelli|author2-link=Luca Cardelli|title=A Theory of Objects|publisher=Springer-Verlag|year=1996|isbn=978-1-4612-6445-3}}
* [http://www.laputan.org/reflection/warfare.html Class Warfare: Classes vs. Prototypes], by Brian Foote.
* [http://www.laputan.org/reflection/warfare.html Class Warfare: Classes vs. Prototypes], by Brian Foote.
Line 156: Line 154:
* [http://web.media.mit.edu/~lieber/Lieberary/OOP/Delegation/Delegation.html Using Prototypical Objects to Implement Shared Behavior in Object Oriented Systems], by Henry Lieberman, 1986.
* [http://web.media.mit.edu/~lieber/Lieberary/OOP/Delegation/Delegation.html Using Prototypical Objects to Implement Shared Behavior in Object Oriented Systems], by Henry Lieberman, 1986.


{{Types of programming languages}}
{{DEFAULTSORT:Prototype-Based Programming}}
 
{{DEFAULTSORT:Prototype-Based Programming}}[[Category: प्रोटोटाइप-आधारित प्रोग्रामिंग | प्रोटोटाइप-आधारित प्रोग्रामिंग ]] [[Category: ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] [[Category: प्रोग्रामिंग प्रतिमान]] [[Category: प्रकार सिद्धांत]]
 
 


[[Category: Machine Translated Page]]
[[Category:CS1 English-language sources (en)]]
[[Category:Created On 16/02/2023]]
[[Category:Created On 16/02/2023|Prototype-Based Programming]]
[[Category:Lua-based templates|Prototype-Based Programming]]
[[Category:Machine Translated Page|Prototype-Based Programming]]
[[Category:Multi-column templates|Prototype-Based Programming]]
[[Category:Pages using div col with small parameter|Prototype-Based Programming]]
[[Category:Pages with script errors|Prototype-Based Programming]]
[[Category:Short description with empty Wikidata description|Prototype-Based Programming]]
[[Category:Templates Vigyan Ready|Prototype-Based Programming]]
[[Category:Templates that add a tracking category|Prototype-Based Programming]]
[[Category:Templates that generate short descriptions|Prototype-Based Programming]]
[[Category:Templates using TemplateData|Prototype-Based Programming]]
[[Category:Templates using under-protected Lua modules|Prototype-Based Programming]]
[[Category:Wikipedia fully protected templates|Div col]]
[[Category:ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग|Prototype-Based Programming]]
[[Category:प्रकार सिद्धांत|Prototype-Based Programming]]
[[Category:प्रोग्रामिंग प्रतिमान|Prototype-Based Programming]]
[[Category:प्रोटोटाइप-आधारित प्रोग्रामिंग| प्रोटोटाइप-आधारित प्रोग्रामिंग ]]

Latest revision as of 11:02, 21 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] ईसीएमएस्क्रिप्ट 6 ने जावास्क्रिप्ट के सम्मलित प्रोटोटाइप आधारित इनहेरिटेंस पर सिंटैक्टिक शुगर के रूप में क्लास प्रस्तुत कीं थी, और ऑब्जेक्ट को बनाने और इनहेरिटेंस से निपटने का एक वैकल्पिक विधियो प्रदान किया है।[7]


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

  • एक्टर-आधारित समवर्ती लैंग्वेज (ABCL): ABCL/1, ABCL/R, ABCL/R2, ABCL/c plus|ABCL/c+
  • अगोरा (प्रोग्रामिंग लैंग्वेज)
  • ऑटोहॉटकी
  • सेसिल और डीजल क्रेग चेम्बर्स प्रोग्रामिंग लैंग्वेज।
  • कोल्ड सी लैंग्वेज
  • कोला सॉफ्टवेयर आर्किटेक्चर
  • सामान्य लिस्प
  • सियान
  • ईसीएमएस्क्रिप्ट
    • एक्शनस्क्रिप्ट1.0, एडोब फ्लैश और एडोब फ्लेक्स द्वारा उपयोग किया जाता है
    • इ4 एक्स
    • जावास्क्रिप्ट
    • जेस्क्रिप्ट
    • टाइपस्क्रिप्ट
  • आईओ (प्रोग्रामिंग लैंग्वेज)
  • इओके (प्रोग्रामिंग लैंग्वेज)
  • जेसननेट (प्रोग्रामिंग लैंग्वेज)
  • लोगटॉक
  • एलपीसी (प्रोग्रामिंग लैंग्वेज)
  • लुआ (प्रोग्रामिंग लैंग्वेज)
  • एम2000 (प्रोग्रामिंग लैंग्वेज)
  • मेपल (सॉफ्टवेयर)
  • एमओओ (प्रोग्रामिंग लैंग्वेज)
  • नेको (प्रोग्रामिंग लैंग्वेज)
  • न्यूटनस्क्रिप्ट
  • निम (प्रोग्रामिंग लैंग्वेज)
  • निक्स पैकेज मैनेजर
  • ऑब्जेक्ट लिस्प
  • ओब्लिक
  • ओमेगा (प्रोग्रामिंग लैंग्वेज)
  • ओपन लैज़लो
  • पर्ल, क्लास :: प्रोटोटाइप मॉड्यूल के साथ
  • पायथन (प्रोग्रामिंग लैंग्वेज) प्रोटोटाइप.पीवाई के साथ।
  • आर (प्रोग्रामिंग लैंग्वेज), प्रोटो पैकेज के साथ
  • रिबोल
  • रेड (प्रोग्रामिंग लैंग्वेज)
  • रूबी (प्रोग्रामिंग लैंग्वेज)
  • सेल्फ (प्रोग्रामिंग लैंग्वेज)
  • सेफ (प्रोग्रामिंग लैंग्वेज)
  • स्लेट (प्रोग्रामिंग लैंग्वेज)
  • स्मार्टफ्रॉग
  • स्नैप (प्रोग्रामिंग लैंग्वेज)|
  • [[इटॉयस (प्रोग्रामिंग लैंग्वेज)
  • टेडस
  • स्निट एक्सटेंशन के साथ टीसीएल
  • उमाजिन


यह भी देखें

संदर्भ

  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.


अग्रिम पठन