जावास्क्रिप्ट के साथ एक प्रमुख लाभ यह है कि यह एक प्रोटोटाइप आधारित भाषा है।
लेकिन इसका क्या मतलब है कि जावास्क्रिप्ट प्रोटोटाइप आधारित है, और यह एक फायदा क्यों है?
जावास्क्रिप्ट के साथ एक प्रमुख लाभ यह है कि यह एक प्रोटोटाइप आधारित भाषा है।
लेकिन इसका क्या मतलब है कि जावास्क्रिप्ट प्रोटोटाइप आधारित है, और यह एक फायदा क्यों है?
जवाबों:
प्रोटोटाइप इनहेरिटेंस ऑब्जेक्ट-ओरिएंटेड कोड रीयूज का एक रूप है । जावास्क्रिप्ट प्रोटोटाइप प्रोटोटाइप का उपयोग करने के लिए केवल [मुख्य धारा] वस्तु-उन्मुख भाषाओं में से एक है। लगभग सभी अन्य वस्तु-उन्मुख भाषाएँ शास्त्रीय हैं।
में शास्त्रीय विरासत , प्रोग्रामर एक वर्ग है, जो एक वस्तु को परिभाषित करता है लिखता है। एक ही क्लास से कई ऑब्जेक्ट्स को इंस्टेंट किया जा सकता है, इसलिए आपके पास एक स्थान पर कोड होता है जो आपके प्रोग्राम में कई ऑब्जेक्ट्स का वर्णन करता है। कक्षाओं को फिर एक पदानुक्रम में व्यवस्थित किया जा सकता है, कोड पुन: उपयोग को आगे बढ़ाया जा सकता है। अधिक सामान्य कोड एक उच्च-स्तरीय कक्षा में संग्रहीत किया जाता है, जिससे निचले स्तर की कक्षाएं विरासत में मिलती हैं। इसका मतलब यह है कि एक वस्तु एक ही कक्षा की अन्य वस्तुओं के साथ-साथ उसके मूल वर्गों के साथ कोड साझा कर रही है।
में मूलरूप विरासत रूप है, वस्तुओं सीधे वारिस अन्य वस्तुओं से। कक्षाओं के बारे में सभी व्यवसाय चले जाते हैं। यदि आप एक वस्तु चाहते हैं, तो आप सिर्फ एक वस्तु लिखते हैं। लेकिन कोड का पुन: उपयोग अभी भी एक मूल्यवान वस्तु है, इसलिए वस्तुओं को एक पदानुक्रम में एक साथ जोड़ा जाने की अनुमति है। जावास्क्रिप्ट में, प्रत्येक ऑब्जेक्ट में उस ऑब्जेक्ट का एक गुप्त लिंक होता है जिसने इसे बनाया था, जिससे एक चेन बनाई गई थी। जब किसी ऑब्जेक्ट को उस संपत्ति के लिए कहा जाता है जो उसके पास नहीं है, तो उसके मूल ऑब्जेक्ट से पूछा जाएगा ... जब तक कि संपत्ति नहीं मिलती है या रूट ऑब्जेक्ट तक नहीं पहुंचता है, तब तक श्रृंखला को लगातार बनाए रखें।
जावास्क्रिप्ट में प्रत्येक फ़ंक्शन (जो स्वयं वस्तुएं हैं) में वास्तव में "प्रोटोटाइप" नामक एक सदस्य होता है, जो किसी ऑब्जेक्ट से उनके द्वारा पूछे जाने पर मान प्रदान करने के लिए जिम्मेदार होता है। इस सदस्य के पास निर्माण तंत्र (जिसके द्वारा कार्यों से वस्तुओं का निर्माण होता है) को कार्य करने की अनुमति देता है। किसी फ़ंक्शन ऑब्जेक्ट के प्रोटोटाइप में एक संपत्ति जोड़ने से यह निर्माण की गई वस्तु को उपलब्ध होगा, साथ ही उन सभी वस्तुओं को भी मिलेगा जो इसे प्राप्त करते हैं।
लाभ
वहाँ एक कठोर और तेज़ नियम नहीं हो सकता है क्योंकि प्रोटोटाइप विरासत में कोड-पुन: उपयोग का एक लाभप्रद रूप क्यों है। कोड का पुन: उपयोग करना लाभप्रद है, और प्रोटोटाइप इनहेरिटेंस इसके बारे में जाने का एक समझदार तरीका है। आप तर्क दे सकते हैं कि प्रोटोटाइप इनहेरिटेंस कोड पुन: उपयोग का एक काफी सरल मॉडल है, और उस कोड का प्रत्यक्ष तरीकों से भारी पुन: उपयोग किया जा सकता है । लेकिन शास्त्रीय भाषाएँ निश्चित रूप से इसे पूरा करने में सक्षम हैं।
Sidenote: @Andrew Hedges एक अच्छी बात कहता है , कि वास्तव में कई प्रोटोटाइप भाषाएँ हैं। यह ध्यान देने योग्य है कि ये अन्य मौजूद हैं, लेकिन यह भी ध्यान देने योग्य है कि उनमें से कोई भी मुख्यधारा के करीब कुछ भी नहीं है। न्यूटनस्क्रिप्ट को कुछ समय के लिए कुछ कर्षण लग रहा था, लेकिन इसकी प्लेटफॉर्म से मृत्यु हो गई। कुछ आधुनिक भाषाओं को उन तरीकों से विस्तारित करना भी संभव है जो प्रोटोटाइप क्षमताओं को जोड़ते हैं।
एक प्रोटोटाइप-आधारित भाषा, कक्षाओं बनाम वस्तुओं का भेद नहीं करती है: इसमें बस ऑब्जेक्ट हैं। एक प्रोटोटाइप-आधारित भाषा में एक प्रोटोटाइप ऑब्जेक्ट की धारणा है, एक टेम्प्लेट के रूप में उपयोग की जाने वाली वस्तु जिसमें से एक नई वस्तु के लिए प्रारंभिक गुण प्राप्त होते हैं। कोई भी वस्तु अपने गुणों को निर्दिष्ट कर सकती है, या तो जब आप इसे बनाते हैं या रन टाइम पर। इसके अलावा, किसी भी वस्तु को किसी अन्य वस्तु के प्रोटोटाइप के रूप में जोड़ा जा सकता है , जिससे दूसरी वस्तु पहली वस्तु के गुणों को साझा कर सकती है।
प्रोटोटाइप-आधारित प्रोग्रामिंग ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की एक शैली है जहां कक्षाएं मौजूद नहीं हैं, और प्रोटोटाइप के रूप में काम करने वाली मौजूदा वस्तुओं को क्लोन करके व्यवहार पुन: उपयोग (या वर्ग-आधारित भाषाओं में विरासत) किया जाता है।
लाभ / हानि यह है कि, हम वर्गों (स्थैतिक कोड) को परिभाषित करने की आवश्यकता के बिना रन टाइम पर नई प्रकार की वस्तुएं बना सकते हैं। अधिकांश सुविधाओं की तरह यह डेवलपर के ऊपर है कि वह इसे एक लाभ / हानि में बदल दे।
ऊपर संभव है क्योंकि ऑब्जेक्ट्स अनिवार्य रूप से जावा स्क्रिप्ट (क्लोजर भी) में कार्य करते हैं।
यदि आप नई वस्तुओं के निर्माण के लिए संकलित करने के लिए एक वर्ग के बजाय रनटाइम पर वस्तुओं का उपयोग करते हैं, तो इससे किसी भी विवरण को जाने बिना किसी वस्तु के विस्तार की संभावना खुल जाती है। बेशक, यह उपयोग के आधार पर बहुत जल्दी एक नुकसान बन सकता है। मैं यहां भाषा के बारे में कोई धारणा नहीं बनाता, इसलिए यह जावास्क्रिप्ट के अलावा अन्य भाषाओं पर भी लागू होती है, जो उतनी गतिशील नहीं हैं।
myobject.prototype=unkownobject;
myobject.newproperty=1;
आपको वस्तु कहीं से भी प्राप्त हो सकती है; आपका अपना कोड, नेटवर्क से, डेटाबेस से, बाहरी लिंकेज आदि से।
ध्यान दें, एक भाषा को जावास्क्रिप्ट की तरह प्रोटोटाइप विरासत को लागू करने की आवश्यकता नहीं है। जावास्क्रिप्ट में, एक प्रोटोटाइप ऑब्जेक्ट को केवल साझा किया जाता है, इसलिए विरासत के बीच में इसके गुण हैं। विकल्प प्रोटोटाइप के सभी गुणों को नई वस्तु पर कॉपी कर रहा है। प्रत्येक दृष्टिकोण की विभिन्न स्थितियों में अपनी ताकत होती है। मुझे दूसरी पसंद है लेकिन यह वह नहीं है जो जावास्क्रिप्ट करता है।
सभी उत्तरों को पढ़ने के बाद यह निष्कर्ष है
1) वंशानुक्रम जिसमें वस्तुओं को अन्य वस्तुओं से सीधे विरासत में मिला है
2) जो कक्षाओं का उपयोग नहीं करता है
3) उदाहरण आधारित प्रोग्रामिंग या क्लासलेस प्रोटोटाइप ओरिएंटेड प्रोग्रामिंग भी कहा जाता है
4) व्यवहार का पुन: उपयोग मौजूदा वस्तुओं को क्लोन करके किया जाता है जो प्रोटोटाइप के रूप में काम करते हैं
5) नई वस्तु से टेम्पलेट के रूप में उपयोग की जाने वाली वस्तु को प्रारंभिक गुण मिलते हैं