पहले अंतर को संक्षेप में प्रस्तुत किया जा सकता है: वर्ग this
के उदाहरण को संदर्भित करता है । prototype
को संदर्भित करता है परिभाषा ।
मान लें कि हमारे पास निम्न वर्ग है:
var Flight = function ( number ) { this.number = number; };
इसलिए यहाँ हम this.number
कक्षा के हर उदाहरण के साथ जुड़ रहे हैं , और यह समझ में आता है क्योंकि प्रत्येक की Flight
अपनी उड़ान संख्या होनी चाहिए।
var flightOne = new Flight( "ABC" );
var flightTwo = new Flight( "XYZ" );
इसके विपरीत, prototype
एकल संपत्ति को परिभाषित करता है जिसे सभी उदाहरणों द्वारा पहुँचा जा सकता है।
अब अगर हम उड़ान संख्या प्राप्त करना चाहते हैं, तो हम केवल निम्नलिखित स्निपेट लिख सकते हैं और हमारे सभी उदाहरणों को इस नई प्रोटोटाइप ऑब्जेक्ट का संदर्भ मिलेगा ।
Flight.prototype.getNumber = function () { return this.number; };
दूसरा अंतर उस तरीके के बारे में है जिसे जावास्क्रिप्ट किसी वस्तु की संपत्ति के लिए खोजता है। जब आप खोज रहे हैं Object.whatever
, तो जावास्क्रिप्ट सभी तरह से मुख्य ऑब्जेक्ट ऑब्जेक्ट (ऑब्जेक्ट जो कि बाकी सब कुछ विरासत में मिला है) तक जाता है, और जैसे ही यह एक मैच पाता है यह वापस आ जाएगा या इसे कॉल करेगा।
लेकिन यह केवल प्रोटोप्टेड गुणों के लिए होता है। इसलिए यदि आपके पास उच्च स्तर पर कहीं है this.whatever
, तो जावास्क्रिप्ट इसे एक मैच के रूप में नहीं मानेगा और खोज जारी रखेगा।
आइए देखें कि यह वास्तविकता में कैसे होता है।
पहले ध्यान दें कि [लगभग] सब कुछ जावास्क्रिप्ट में ऑब्जेक्ट हैं । इसे इस्तेमाल करे:
typeof null
अब देखते हैं कि अंदर क्या है Object
(ऊपरवाला नोट O
और .
अंत में)। Google Chrome के डेवलपर टूल में जब आप प्रवेश करते हैं .
तो आपको उस विशिष्ट ऑब्जेक्ट के अंदर उपलब्ध गुणों की एक सूची मिल जाएगी।
Object.
अब के लिए एक ही काम करते हैं Function
:
Function.
आप name
विधि नोटिस कर सकते हैं । बस जाओ और आग लगा दो और देखते हैं क्या होता है:
Object.name
Function.name
अब एक फंक्शन बनाते हैं:
var myFunc = function () {};
और देखते हैं कि क्या हमें यहां भी name
विधि मिली है :
myFunc.name
आपको एक खाली स्ट्रिंग मिलना चाहिए, लेकिन यह ठीक है। आपको एक त्रुटि या अपवाद नहीं मिलना चाहिए।
अब उस देवता की तरह कुछ जोड़ते हैं Object
और देखते हैं कि क्या हम इसे अन्य स्थानों पर भी प्राप्त करते हैं?
Object.prototype.test = "Okay!";
और वहाँ तुम जाओ:
Object.prototype.test
Function.prototype.test
myFunc.prototype.test
सभी मामलों में आपको देखना चाहिए "Okay!"
।
प्रत्येक विधि के पेशेवरों और विपक्षों के बारे में आप चीजों को करने के "अधिक-कुशल" तरीके के रूप में प्रोटोटाइप पर विचार कर सकते हैं, क्योंकि यह प्रत्येक ऑब्जेक्ट में पूरी संपत्ति की नकल करने के बजाय हर उदाहरण पर एक संदर्भ रखता है। दूसरी ओर यह टाइटली कपलिंग का एक उदाहरण है जो एक बड़ी संख्या है, जब तक आप वास्तव में कारण को सही नहीं ठहरा सकते। this
संदर्भ के लिए प्रासंगिक है क्योंकि यह काफी जटिल है। आप इंटरनेट में बहुत सारे अच्छे संसाधन मुफ्त में पा सकते हैं।
उस सभी ने कहा, दोनों तरीके सिर्फ भाषा के उपकरण हैं और यह वास्तव में आप पर निर्भर करता है और आप जिस समस्या को हल करने का प्रयास कर रहे हैं वह बेहतर है।
यदि आपको किसी वर्ग के प्रत्येक उदाहरण के लिए प्रासंगिक होना चाहिए, तो उपयोग करें this
। यदि आपको प्रत्येक उदाहरण पर समान कार्य करने के लिए एक संपत्ति की आवश्यकता है, तो उपयोग करें prototype
।
अपडेट करें
आपके नमूना स्निपेट के बारे में, पहला सिंगलटन का एक उदाहरण है , इसलिए यह this
ऑब्जेक्ट बॉडी के भीतर उपयोग करने के लिए समझ में आता है । आप इसे इस तरह से मॉड्यूलर बनाकर अपने उदाहरण में सुधार कर सकते हैं (और आपको हमेशा उपयोग करने की आवश्यकता नहीं है this
)।
/* Assuming it will run in a web browser */
(function (window) {
window.myApp = {
...
}
})( window );
/* And in other pages ... */
(function (myApp) {
myApp.Module = {
...
}
})( myApp );
/* And if you prefer Encapsulation */
(function (myApp) {
myApp.Module = {
"foo": "Foo",
"bar": function ( string ) {
return string;
},
return {
"foor": foo,
"bar": bar
}
}
})( myApp );
आपका दूसरा स्निपेट इतना अधिक अर्थ नहीं रखता है क्योंकि पहले आप उपयोग कर रहे हैं this
और बाद में आप इसे हैक करने की कोशिश कर रहे हैं prototype
, जो काम नहीं करता क्योंकि this
प्राथमिकता से अधिक लगता है prototype
। मुझे यकीन नहीं है कि कोड के उस टुकड़े से आपकी अपेक्षाएं क्या थीं और यह कैसे काम कर रहा था, लेकिन मैं आपको इसे फिर से भरने की सलाह देता हूं।
अपडेट करें
this
पूर्वता लेने के बारे में विस्तार से prototype
बताने के लिए मैं आपको एक उदाहरण दिखा सकता हूं और आपको बता सकता हूं कि इसे कैसे समझाया जा सकता है, लेकिन मेरे पास इसे वापस करने के लिए कोई बाहरी संसाधन नहीं हैं।
उदाहरण बहुत सरल है:
var myClass = function () { this.foo = "Foo"; };
myClass.prototype.foo = "nice try!";
myClass.prototype.bar = "Bar";
var obj = new myClass;
obj.foo; // Still contains "Foo" ...
obj.bar; // Contains "Bar" as expected
स्पष्टीकरण, जैसा कि हम जानते हैं, this
संदर्भ के लिए प्रासंगिक है। इसलिए यह तब तक अस्तित्व में नहीं आएगा जब तक कि संदर्भ तैयार न हो जाए। जब संदर्भ तैयार है? जब नया उदाहरण बनाया जा रहा है! आपको अब बाकी का अनुमान लगाना चाहिए! इसका मतलब यह है कि भले ही एक prototype
परिभाषा है, लेकिन this
पूर्वता लेने के लिए और अधिक समझ में आता है क्योंकि यह उस पल में बनाए जा रहे नए उदाहरण के बारे में है।