प्रोटोटाइप-आधारित प्रोग्रामिंग

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

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

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

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

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

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

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

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

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

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

// 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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

 * वर्ग-आधारित प्रोग्रामिंग (विपरीत)
 * डिफ्रेंशियल इनहेरिटेंस
 * पैराडिगम प्रोग्रामिंग लेन्गवेज
 * प्रोटो.आईओ

अग्रिम पठन

 * Class Warfare: Classes vs. Prototypes, by Brian Foote.
 * Using Prototypical Objects to Implement Shared Behavior in Object Oriented Systems, by Henry Lieberman, 1986.
 * Using Prototypical Objects to Implement Shared Behavior in Object Oriented Systems, by Henry Lieberman, 1986.
 * Using Prototypical Objects to Implement Shared Behavior in Object Oriented Systems, by Henry Lieberman, 1986.