यह आपको व्याकरणिक रूप से गलत और संभवतः पागल प्रश्न के रूप में मार सकता है, लेकिन यहां मेरा मतलब है: जावास्क्रिप्ट में prototype
की अवधारणा को समझने की कोशिश करते समय, मैं उन उदाहरणों पर आया जो निम्नलिखित के थोड़ा या कम जटिल संस्करण थे:जावास्क्रिप्ट प्रोटोटाइप क्यों है?
//Guitar function constructor
function Guitar(color, strings) {
this.color = color;
this.strings = strings;
}
//Create a new instance of a Guitar
var myGuitar = new Guitar('Black', ['D', 'A', 'D', 'F', 'A', 'E']);
//Adding a new method to Guitar via prototype
Guitar.prototype.play = function (chord) {
alert('Playing chord: ' + chord);
};
//Now make use of this new method in a pre-declared instance
myGuitar.play('D5');
तो, मेरी समस्या पर: आप यह क्यों करना चाहते हैं? आप play
फ़ंक्शन को Guitar
में क्यों शुरू नहीं करेंगे? एक उदाहरण घोषित क्यों करें और फिर बाद में विधियों को जोड़ने शुरू करें? एकमात्र कारण यह है कि यदि आप मूल रूप से बनाए गए play
तक पहुंच नहीं पाते हैं, तो मैं myGuitar
पर पहुंचने के लिए चाहता हूं, लेकिन मैं ऐसा कोई उदाहरण नहीं दे सकता हूं कि आप इस तरह कुछ क्यों चाहते हैं।
ऐसा लगता है कि यह यह करने के लिए और अधिक समझ बनाने जाएगा लगता है:
function Guitar(color, string) {
this.color = color;
this.strings = strings;
this.play = function (chord) {
alert('Playing chord: ' + chord);
};
}
var myGuitar = new Guitar('White', ['E', 'A', 'D', 'G', 'B', 'E']);
myGuitar.play('E7#9');
वास्तविक समस्या है कि यहाँ दूसरे उदाहरण जबकि पहला उदाहरण नहीं है मेरे लिए समझ में आता है, जबकि वास्तव में, पहले उदाहरण शायद किसी कारण से बेहतर है। दुर्भाग्यवश, मैंने जो भी ट्यूटोरियल कभी पाया है, वह prototype
का उपयोग करने के चरणों के माध्यम से जाता है, लेकिन क्यों नहीं prototype
पैराडाइम शुरू करने के लिए बिल्कुल मौजूद है।
ऐसा लगता है कि prototype
आपको ऐसी चीजें करने की अनुमति देता है जो आप अन्यथा करने में सक्षम नहीं होंगे, लेकिन मैं इन्हें क्यों करना चाहूंगा, इस बारे में कोई अच्छा कारण नहीं है।
संपादित करें: कुछ प्रतिक्रियाएं:
- जब मैं ने कहा, "क्यों एक उदाहरण की घोषणा और फिर बाद में तरीकों जोड़ना शुरू?" मैं उन सभी उदाहरणों की आलोचना करता हूं जो मैं देखता हूं जो मेरे पहले उदाहरण के क्रम में खेलते हैं। जब यह आदेश बदल जाता है, जैसा कि हर्मन की प्रतिक्रिया में नीचे है, यह थोड़ा और अधिक दृष्टि से समझ में आता है। हालांकि, यह इस तथ्य को नहीं बदलेगा कि, मेरे पहले उदाहरण के समान ही, आप एक खाली ऑब्जेक्ट फ़ंक्शन कन्स्ट्रक्टर बना सकते हैं, इस ऑब्जेक्ट के 100 उदाहरण घोषित कर सकते हैं, और उसके बाद केवल मूल वस्तु को वास्तविक रूप से परिभाषित करें द्वारा
prototype
के माध्यम से इसे विधियों और गुणों को दे रहा है। शायद यह आमतौर पर नीचे उल्लिखित प्रति बनाम संदर्भ विचार पर संकेत देने के लिए इस तरह से किया जाता है। - कई प्रतिक्रियाओं के आधार पर, मेरी नई समझ यहां दी गई है: यदि आप ऑब्जेक्ट फ़ंक्शन कन्स्ट्रक्टर को अपनी सभी गुणों और विधियों को जोड़ते हैं, तो उस ऑब्जेक्ट के 100 उदाहरण बनाएं, आपको सभी गुणों और विधियों की 100 प्रतियां मिलती हैं। इसके बजाय, यदि आप ऑब्जेक्ट फ़ंक्शन कन्स्ट्रक्टर के
prototype
पर अपनी सभी गुणों और विधियों को जोड़ते हैं, तो उस ऑब्जेक्ट के 100 उदाहरण बनाएं, आपको ऑब्जेक्ट की गुणों और विधियों की एकल (1) प्रतिलिपि में 100 संदर्भ प्राप्त करें। यह स्पष्ट रूप से तेज़ और अधिक कुशल है और इसलिएprototype
का उपयोग किया जाता है (नीचे उल्लिखितString
औरImage
जैसी चीजों को बदलने से अलग)। तो, क्यों ऐसा नहीं:
function Guitar(color, strings) {
this.prototype.color = color;
this.prototype.strings = strings;
this.prototype.play = function (chord) {
alert('Playing chord: ' + chord);
};
}
var myGuitar = new Guitar('Blue', ['D', 'A', 'D', 'G', 'B', 'E']);
myGuitar.play('Dm7');
मैं अपने संपादन के लिए मेरा उत्तर अद्यतन करना चाहिए। – hvgotcodes