Advertisement
  1. Code
  2. Web Development

जावास्क्रिप्ट ऑब्जेक्ट्स

Scroll to top
Read Time: 43 mins
This post is part of a series called JavaScript Succinctly.
Working With Objects and Properties

Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)

जावास्क्रिप्ट में, ऑब्जेक्ट्स राजा होता हैं: लगभग सब कुछ एक ऑब्जेक्ट या ऑब्जेक्ट की तरह कार्य करता है। ऑब्जेक्ट्स को समझें और आप जावास्क्रिप्ट को समझेंगे। तो आइए जावास्क्रिप्ट में ऑब्जेक्ट्स के निर्माण की जांच करें।

एक ऑब्जेक्ट नाम वाली वैल्यूज (उर्फ प्रॉपर्टीज) के संग्रह के लिए सिर्फ एक कंटेनर है। किसी भी जावास्क्रिप्ट कोड को देखने से पहले, आइए पहले इसका कारण पता लगाएं। उदाहरण के लिए, खुद को ले लो। प्लेन लैंग्वेज का उपयोग करके, हम एक टेबल, एक "कोडी" में व्यक्त कर सकते हैं:

प्रॉपर्टी प्रॉपर्टी वैल्यू
living True
age 33
gender Male

टेबल में "कोडी" शब्द केवल प्रॉपर्टी नामों और इसी वैल्यूज के ग्रुप के लिए एक लेबल है जो वास्तव में एक कोडी है। जैसा कि आप टेबल से देख सकते हैं, I am living, 33, and a male।

जावास्क्रिप्ट, हालांकि, टेबल में बात नहीं करता है। यह ऑब्जेक्ट्स में बोलता है, जो "कोडी" टेबल में कॉन्टैन भागों के समान होते हैं। कोडी टेबल को वास्तविक जावास्क्रिप्ट ऑब्जेक्ट में अनुवाद करना इस तरह दिखेगा:

सैंपल: sample1.html

इसे अपने दिमाग में सबसे आगे रखें: ऑब्जेक्ट्स वास्तव में केवल प्रॉपर्टीज के लिए कंटेनर हैं, जिनमें से प्रत्येक का नाम और वैल्यू है। नाम वाली वैल्यूज (यानी एक ऑब्जेक्ट) वाली प्रॉपर्टी के कंटेनर की यह धारणा जावास्क्रिप्ट में वैल्यूज को व्यक्त करने के लिए जावास्क्रिप्ट द्वारा बिल्डिंग ब्लॉक के रूप में उपयोग की जाती है। कोडी ऑब्जेक्ट एक वैल्यू है जिसे मैंने एक ऑब्जेक्ट बनाकर जावास्क्रिप्ट ऑब्जेक्ट के रूप में व्यक्त किया है, ऑब्जेक्ट को एक नाम दिया है, और फिर ऑब्जेक्ट को प्रॉपर्टी दी।

इस बिंदु तक, जिस कोडी ऑब्जेक्ट पर हम चर्चा कर रहे हैं वह केवल स्थिर जानकारी है। चूंकि हम एक प्रोग्रामिंग भाषा से डील कर रहे हैं, इसलिए हम वास्तव में कुछ करने के लिए हमारी कोडी ऑब्जेक्ट को प्रोग्राम करना चाहते हैं। अन्यथा, हमारे पास वास्तव में JSON के समान डेटाबेस है। कोडी ऑब्जेक्ट को जीवंत करने के लिए, मुझे एक प्रॉपर्टी मेथड जोड़ना होगा। प्रॉपर्टी मेथड एक फंक्शन को परफॉर्म करते हैं। सटीक होने के लिए, जावास्क्रिप्ट में, मेथड्स वे प्रॉपर्टीज होती हैं जिनमें Function() ऑब्जेक्ट होता है, जिसका इरादा उस ऑब्जेक्ट पर काम करना है जिसमें फ़ंक्शन शामिल है।

अगर मैं कोडे टेबल को getGender मेथड के साथ अपडेट करता हूँ, तो प्लेन इंग्लिश में यह इस तरह दिखेगा:

प्रॉपर्टी प्रॉपर्टी वैल्यू
living True
Age 33
gender Male
getGender return the value of gender

जावास्क्रिप्ट का उपयोग करके, अपडेटेड कोडी टेबल से getGender मेथड इस तरह दिखेगा:

सैंपल: sample2.html

कोडी ऑब्जेक्ट की एक प्रॉपर्टी, getGender मेथड का उपयोग कोडी के अन्य प्रॉपर्टी वैल्यूज में से एक को रीटर्न करने के लिए किया जाता है: जेंडर प्रॉपर्टी में "male" वैल्यू स्टोर्ड है। आपको क्या समझना चाहिए वो है की बिना मेथड्स के, हमारा ऑब्जेक्ट स्टोर स्टेटिक प्रॉपर्टीज को छोड़कर बहुत कुछ नहीं करेगा।

कोडी ऑब्जेक्ट जिस पर हमने चर्चा की है अब तक Object() ऑब्जेक्ट के रूप में जाना जाता है। हमने Object() कन्स्ट्रक्टर फ़ंक्शन का आविष्कार करके हमें प्रदान किये गए एक खाली ऑब्जेक्ट का उपयोग करके कोडी ऑब्जेक्ट बनाया। प्रीडिफाइंड ऑब्जेक्ट्स के उत्पादन के लिए टेम्पलेट या कुकी कटर के रूप में कन्स्ट्रक्टर फंक्शन्स के बारे में सोचें। कोडी ऑब्जेक्ट के मामले में, मैंने Object() कन्स्ट्रक्टर फ़ंक्शन का उपयोग एक खाली ऑब्जेक्ट बनाने के लिए किया था जिसे मैंने कोडी नाम दिया था। क्योंकि कोडी Object() कन्स्ट्रक्टर से निर्मित ऑब्जेक्ट है, इसलिए हम कोडी को Object() को ऑब्जेक्ट कहते हैं। कोडी जैसे साधारण Object() ऑब्जेक्ट के निर्माण से परे आपको वास्तव में समझने की आवश्यकता है, यह है कि जावास्क्रिप्ट में व्यक्त किए गए वैल्यूज में से अधिकांश ऑब्जेक्ट्स हैं ("foo", 5, और true जैसे प्रिमिटिव वैल्यू अपवाद हैं लेकिन एक्विवैलेन्ट रैपर हैं ऑब्जेक्ट्स)।

ध्यान दें कि Object() कन्स्ट्रक्टर फ़ंक्शन से बनाई गई कोडी ऑब्जेक्ट String() कन्स्ट्रक्टर फ़ंक्शन के माध्यम से बनाई गई स्ट्रिंग ऑब्जेक्ट से वास्तव में अलग नहीं है। इस तथ्य को चलाने के लिए, निम्न कोड की जांच करें और कंट्रास्ट करें:

सैंपल: sample3.html

जैसा कि यह पता चला है, myObject और myString दोनों हैं। objects! वे दोनों प्रॉपर्टीज हो सकते हैं, प्रॉपर्टीज इन्हेरिट हो सकते हैं, और एक constructor फंक्शन से प्रोडूस होते हैं। 'foo' स्ट्रिंग वैल्यू वाला myString वेरिएबल जितना आसान हो उतना आसान लगता है, लेकिन आश्चर्यजनक रूप से इसकी सतह के नीचे एक ऑब्जेक्ट संरचना है। यदि आप प्रोडूसड दोनों ऑब्जेक्ट्स की जांच करते हैं तो आप देखेंगे कि वे सब्स्टन्स में समान ऑब्जेक्ट्स हैं लेकिन टाइप में नहीं हैं। सबसे महत्वपूर्ण बात यह है कि, मुझे आशा है कि आप यह देखना शुरू कर देंगे कि जावास्क्रिप्ट वैल्यूज को व्यक्त करने के लिए ऑब्जेक्ट्स का उपयोग करता है।

आपको ऑब्जेक्ट फॉर्म में स्ट्रिंग वैल्यू 'foo' देखने में अजीब लग सकता है क्योंकि आमतौर पर एक स्ट्रिंग को जावास्क्रिप्ट में एक प्रिमिटिव वैल्यू के रूप में दर्शाया जाता है (उदा., var myString = 'foo';)। मैंने विशेष रूप से एक स्ट्रिंग ऑब्जेक्ट वैल्यू का उपयोग इस हाइलाइट करने के लिए किया है कि कुछ भी ऑब्जेक्ट हो सकता है, जिसमें वे वैल्यू भी शामिल हैं जिन्हें हम आमतौर पर ऑब्जेक्ट (उदा. स्ट्रिंग, नंबर, बूलियन) के रूप में नहीं सोच सकते हैं। साथ ही, मुझे लगता है कि यह समझाने में मदद करता है कि कुछ क्यों कहते हैं कि जावास्क्रिप्ट में सबकुछ एक ऑब्जेक्ट हो सकता है।

जावास्क्रिप्ट String() और Object() कन्स्ट्रक्टर को String() ऑब्जेक्ट और Object() ऑब्जेक्ट ट्राइविअल (trivial) के निर्माण के लिए भाषा में स्वयं को बनाता है। लेकिन आप, जावास्क्रिप्ट भाषा के कोडर के रूप में, समान रूप से शक्तिशाली कन्स्ट्रक्टर फ़ंक्शन भी बना सकते हैं। निम्नलिखित सैंपल में, मैं इसे नॉन-नेटिव कस्टम Person() कन्स्ट्रक्टर फ़ंक्शन को परिभाषित करके प्रदर्शित करता हूं ताकि मैं इससे लोगों को बना सकूं।

सैंपल: sample4.html

यूजर परिभाषित Person() कन्स्ट्रक्टर फ़ंक्शन Person ऑब्जेक्ट्स का उत्पादन कर सकता है, जैसे नेटिव String() कन्स्ट्रक्टर फ़ंक्शन स्ट्रिंग ऑब्जेक्ट्स का उत्पादन कर सकता है। Person() कन्स्ट्रक्टर कम सक्षम नहीं है, और मूल String() कन्स्ट्रक्टर या जावास्क्रिप्ट में पाए गए मूल constructor की तुलना में कम या अधिक लचीला नहीं है।

याद रखें कि हमने जिस कोडी ऑब्जेक्ट को पहली बार देखा था उसे Object() से बनाया गया था। यह ध्यान रखना महत्वपूर्ण है कि Object() कन्स्ट्रक्टर फ़ंक्शन और पिछले कोड में दिखाए गए नए Person() कन्स्ट्रक्टर हमें समान परिणाम दे सकते हैं। दोनों समान प्रॉपर्टीज और प्रॉपर्टी मेथड्स के साथ एक समान ऑब्जेक्ट उत्पन्न कर सकते हैं। कोड के दो सेक्शन का परीक्षण करें जो दर्शाते हैं कि codyA और codyB के समान ऑब्जेक्ट वैल्यू हैं, भले ही वे विभिन्न तरीकों से प्रोडूस हों।

सैंपल: sample5.html

codyA और codyB ऑब्जेक्ट्स के बीच मुख्य अंतर ऑब्जेक्ट में ही नहीं मिलता है, लेकिन ऑब्जेक्ट्स बनाने के लिए प्रयुक्त कन्स्ट्रक्टर फ़ंक्शंस में। codyA ऑब्जेक्ट Object() कन्स्ट्रक्टर के उदाहरण का उपयोग करके उत्पादित किया गया था। Person() कन्स्ट्रक्टर ने codyB का उत्पादन किया, लेकिन इसे अधिक Person() ऑब्जेक्ट्स बनाने के लिए इस्तेमाल होने के लिए एक शक्तिशाली, केंद्रीय परिभाषित ऑब्जेक्ट "factory" के रूप में भी इस्तेमाल किया जा सकता है। कस्टम ऑब्जेक्ट्स बनाने के लिए अपने स्वयं के कन्स्ट्रक्टर तैयार करना Person() इंस्टैंस के लिए प्रोटोटाइप इनहेरिटेंस भी सेट करता है।

दोनों समाधानों के परिणामस्वरूप एक ही जटिल ऑब्जेक्ट उत्पन्न किया गया। ये दो पैटर्न हैं जिनका उपयोग आमतौर पर ऑब्जेक्ट्स के निर्माण के लिए किया जाता है।

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

ऑब्जेक्ट्स के निर्माण, व्यवहार, और प्रयोग को समझने और उनके प्रिमिटिव एक्विवैलेन्ट बाकी बची किताब का फोकस है।


जावास्क्रिप्ट कन्स्ट्रक्टर्स ऑब्जेक्ट के इंस्टेंस को बनाना और रीटर्न करना

एक कन्स्ट्रक्टर फ़ंक्शन का रोल कई ऑब्जेक्ट्स को बनाना है जो कुछ क्वालिटीज़ और व्यवहारों को शेयर करते हैं। असल में, एक कन्स्ट्रक्टर फ़ंक्शन एक कुकी कटर है जो ऑब्जेक्ट्स बनाने के लिए होता है जिनमें डिफ़ॉल्ट प्रॉपर्टीज और प्रॉपर्टी मेथड्स होते हैं।

यदि आप कहते हैं, "एक कन्स्ट्रक्टर किसी फ़ंक्शन से अधिक कुछ नहीं है," तो मैं जवाब दूंगा, "आप सही हैं कि new कीवर्ड का उपयोग करके फ़ंक्शन का इनवॉक किया जाता है।" (उदाहरण के लिए, new String('foo'))। जब ऐसा होता है, तो एक फ़ंक्शन एक विशेष भूमिका निभाता है, और जावास्क्रिप्ट फ़ंक्शन को एक स्पेशल की तरह मानता है इसके लिए वह नए ऑब्जेक्ट के फंक्शन की वैल्यू को this पर सेट करता है जिसे कंस्ट्रक्ट किया जा रहा है। इस विशेष व्यवहार के अलावा, फ़ंक्शन false वैल्यू के बदले डिफ़ॉल्ट रूप से नव निर्मित ऑब्जेक्ट (यानी this) को रीटर्न कर देगा। फ़ंक्शन से रीटर्न किये गए नए ऑब्जेक्ट को कन्स्ट्रक्टर फ़ंक्शन का एक इंस्टैंस माना जाता है जो इसे कंस्ट्रक्ट करता है।

Person() कन्स्ट्रक्टर पर दोबारा विचार करें, लेकिन इस बार निम्नलिखित कोड सैंपल में कमैंट्स को ध्यान से पढ़ें, क्योंकि वे new कीवर्ड के इफ़ेक्ट को हाइलाइट करते हैं।

सैंपल: sample6.html

sample6.html कोड कोडी ऑब्जेक्ट बनाने के लिए यूजर द्वारा परिभाषित कन्स्ट्रक्टर फ़ंक्शन (यानी Person()) का लाभ उठाता है। यह निम्नलिखित कोड में Array() ऑब्जेक्ट (उदा., new Array()) बनाने वाले Array() कन्स्ट्रक्टर से अलग नहीं है।

सैंपल: sample7.html

जावास्क्रिप्ट में, अधिकांश वैल्यू (प्रिमिटिव वैल्यूज को छोड़कर) एक कन्स्ट्रक्टर फ़ंक्शन से बनाए जा रहे ऑब्जेक्ट्स, या इंस्टांसेशियेट, शामिल होते हैं। एक कन्स्ट्रक्टर से रीटर्न किये गए ऑब्जेक्ट को एक इंस्टैंस कहा जाता है। सुनिश्चित करें कि आप इन सिमेंटिक के साथ सहज हैं, साथ ही ऑब्जेक्ट्स बनाने के लिए कन्वर्टर का लाभ उठाने के पैटर्न भी हैं।


नेटिव जावास्क्रिप्ट ऑब्जेक्ट कन्स्ट्रक्टर

जावास्क्रिप्ट लैंग्वेज में नौ नेटिव (या बिल्ट-इन) ऑब्जेक्ट कन्स्ट्रक्टर शामिल हैं। इन ऑब्जेक्ट्स का उपयोग लैंग्वेज बनाने के लिए जावास्क्रिप्ट द्वारा किया जाता है, और "construct" से मेरा मतलब है कि इन ऑब्जेक्ट्स का उपयोग जावास्क्रिप्ट कोड में ऑब्जेक्ट वैल्यू व्यक्त करने के साथ-साथ भाषा की कई विशेषताओं को ऑर्केस्ट्रेट करने के लिए किया जाता है। इस प्रकार, नेटिव ऑब्जेक्ट कन्स्ट्रक्टर मल्टीफासिटेड होते हैं जिसमें वे ऑब्जेक्ट्स को कंस्ट्रक्ट करते हैं, लेकिन कई लैंग्वेज प्रोग्रामिंग फंक्शन्स को सुविधाजनक बनाने में भी लीवरेज होते हैं। उदाहरण के लिए, फ़ंक्शंस Function() कन्स्ट्रक्टर से बनाई गई ऑब्जेक्ट्स हैं, लेकिन new कीवर्ड का उपयोग करके कन्स्ट्रक्टर फ़ंक्शन के रूप में बुलाए जाने पर अन्य ऑब्जेक्ट्स बनाने के लिए भी उपयोग किया जाता है।

जावास्क्रिप्ट के साथ प्रीपेक किए गए नौ नेटिव ऑब्जेक्ट कन्स्ट्रक्टर हैं:

  • Number()
  • String()
  • Boolean()
  • Object()
  • Array()
  • Function()
  • Date()
  • RegExp()
  • Error()

जावास्क्रिप्ट ज्यादातर इन नौ ऑब्जेक्ट्स (साथ ही स्ट्रिंग, नंबर, और बूलियन प्रिमिटिव वैल्यूज) से बनाया गया है। इन ऑब्जेक्ट्स को विस्तार से समझना जावास्क्रिप्ट की यूनिक प्रोग्रामिंग पावर और लैंग्वेज के लचीलापन का लाभ उठाने के लिए महत्वपूर्ण है।

Math ऑब्जेक्ट यहां ओडबॉल है। यह एक कन्स्ट्रक्टर फ़ंक्शन की बजाय एक स्टेटिक ऑब्जेक्ट है, जिसका अर्थ है कि आप यह नहीं कर सकते: var x = new Math()। लेकिन आप इसका उपयोग कर सकते हैं जैसे कि इसे पहले से ही इंस्टैंशियेट कर दिया गया है (उदाहरण के लिए, Math.PI)। वास्तव में, Math जावास्क्रिप्ट द्वारा गणित के फंक्शन्स को घर बनाने के लिए बस एक ऑब्जेक्ट नेमस्पेस सेटअप किया गया है।

नेटिव ऑब्जेक्ट्स को कभी-कभी "ग्लोबल ऑब्जेक्ट्स" के रूप में जाना जाता है क्योंकि वे ऑब्जेक्ट्स हैं जो जावास्क्रिप्ट ने उपयोग के लिए नेटिव रूप से उपलब्ध कराए हैं। ग्लोबल ऑब्जेक्ट को "head" ग्लोबल ऑब्जेक्ट के साथ भ्रमित न करें जो स्कोप चेन का सबसे ऊपर स्तर है, उदाहरण के लिए, सभी वेब ब्राउज़र में window ऑब्जेक्ट होता है।

Number(), String(), और Boolean() कन्स्ट्रक्टर न केवल ऑब्जेक्ट्स का निर्माण करते हैं; वे कन्स्ट्रक्टर लीवरेज के आधार पर स्ट्रिंग, नंबर और बूलियन के लिए एक प्रिमिटिव वैल्यू भी प्रदान करते हैं। यदि आप इन कन्स्ट्रक्टर को सीधे कॉल करते हैं, तो एक जटिल ऑब्जेक्ट रीटर्न होता है। यदि आप बस अपने कोड में एक संख्या, स्ट्रिंग, या बूलियन वैल्यू व्यक्त करते हैं (5, "foo", और true जैसे प्रिमिटिव वैल्यू), तो कन्स्ट्रक्टर जटिल ऑब्जेक्ट वैल्यू के बजाय एक प्रिमिटिव वैल्यू रीटर्न कर देगा।


यूजर द्वारा परिभाषित/नॉन-नेटिव ऑब्जेक्ट कन्स्ट्रक्टर फ़ंक्शन

जैसा कि आपने Person() कन्स्ट्रक्टर के साथ देखा है, हम अपने स्वयं के कन्स्ट्रक्टर फ़ंक्शंस बना सकते हैं जिससे हम न केवल एक, बल्कि कई कस्टम ऑब्जेक्ट्स जेनेरेट कर सकते हैं।

निम्नलिखित सैंपल में, मैं परिचित Person() कन्स्ट्रक्टर फ़ंक्शन प्रस्तुत करता हूं:

सैंपल: sample8.html

जैसा कि आप देख सकते हैं, यूनिक पैरामीटर्स को इनवॉक करके और Person() कन्स्ट्रक्टर फ़ंक्शन का आह्वान करके, आप आसानी से यूनिक लोगों की एक बड़ी संख्या बना सकते हैं। यह बहुत आसान हो सकता है जब आपको दो या तीन से अधिक ऑब्जेक्ट्स की आवश्यकता होती है जिनमें समान प्रॉपर्टीज होते हैं, लेकिन विभिन्न वैल्यूज के साथ। इसके बारे में सोचने के लिए आओ, यह वही है जो जावास्क्रिप्ट नेटिव ऑब्जेक्ट्स के साथ करता है। The Person() कन्स्ट्रक्टर Array() कन्स्ट्रक्टर के समान प्रिंसिपल का पालन करता है। तो new Array('foo', 'bar') वास्तव में new Person(true, 33, 'male') से अलग नहीं है। अपने स्वयं के कन्स्ट्रक्टर फ़ंक्शंस बनाना केवल उसी पैटर्न का उपयोग कर रहा है जो जावास्क्रिप्ट स्वयं अपने नेटिव कन्स्ट्रक्टर फंक्शन के लिए उपयोग करता है।

यह आवश्यक नहीं है, लेकिन जब नए ऑपरेटर के साथ उपयोग किए जाने वाले कस्टम कन्स्ट्रक्टर फ़ंक्शंस का निर्माण होता है, तो कन्स्ट्रक्टर नाम अपरकेस के पहले करैक्टर को बनाने का सबसे अच्छा अभ्यास: Person() के बजाय person()

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

यह संभव है की आप अलग से एक फंक्शन बनाकर जो ऑब्जेक्ट को रीटर्न करें new कीवर्ड का प्रयोग और कन्स्ट्रक्टर फंक्शन के कांसेप्ट का प्रयोग करना भूल जाएँ। फ़ंक्शन को Object() ऑब्जेक्ट बनाने के लिए स्पष्ट रूप से लिखा जाना चाहिए और इसे रीटर्न करना होगा: var myFunction = function () {return {prop: val}};


new ऑपरेटर का उपयोग कर कंसट्रेटर्स को इंस्टैंशियेट करना

एक कन्स्ट्रक्टर फ़ंक्शन मूल रूप से एक कुकी-कटर टेम्पलेट होता है जो पूर्व-कॉन्फ़िगर किए गए ऑब्जेक्ट्स बनाने के लिए उपयोग किया जाता है। उदाहरण के लिए String() लें। यह फ़ंक्शन, जब new ऑपरेटर (new String('foo')) के साथ उपयोग किया जाता है String() "टेम्पलेट" के आधार पर एक स्ट्रिंग इंस्टैंस बनाता है। आइए एक उदाहरण देखें।

सैंपल: sample9.html

इस स्निपेट में, हमने एक new स्ट्रिंग ऑब्जेक्ट बनाया है जो String() कन्स्ट्रक्टर फ़ंक्शन का एक इंस्टैंस है। बस इसी तरह, हमारे पास जावास्क्रिप्ट में एक स्ट्रिंग वैल्यू व्यक्त की गयी है।

मैं यह सुझाव नहीं दे रहा हूं कि आप उनके लिट्रल/प्रिमिटिव समकक्षों की बजाय कन्स्ट्रक्टर फ़ंक्शंस का उपयोग करें जैसे var string = "foo"; हालांकि, मैं सुझाव दे रहा हूं कि आप समझते हैं कि लिट्रल/प्रिमिटिव वैल्यूज के पीछे क्या चल रहा है।

जैसा कि पहले उल्लेख किया गया है, जावास्क्रिप्ट लैंग्वेज में निम्नलिखित नेटिव पूर्वनिर्धारित कन्स्ट्रक्टर हैं: Number(), String(), Boolean(), Object(), Array(), Function(), Date(), RegExp(), और Error()। हम new ऑपरेटर को लागू करके इन कन्स्ट्रक्टर फंक्शन्स में से किसी एक ऑब्जेक्ट इंस्टेंस को तुरंत चालू कर सकते हैं। निम्नलिखित सैंपल में, मैं इन नौ नेटिव जावास्क्रिप्ट ऑब्जेक्ट्स का निर्माण करता हूं।

सैंपल: sample10.html

new ऑपरेटर का उपयोग करके, हम जावास्क्रिप्ट इंटरप्रेटर को बता रहे हैं कि हम एक ऑब्जेक्ट चाहते हैं जो संबंधित कन्स्ट्रक्टर फ़ंक्शन का इंस्टैंस है। उदाहरण के लिए, कोड सैंपल में, Date() कन्स्ट्रक्टर फ़ंक्शन का उपयोग डेट ऑब्जेक्ट्स बनाने के लिए किया जाता है। Date() कन्स्ट्रक्टर फ़ंक्शन डेट ऑब्जेक्ट्स के लिए कुकी कटर है। यही है, यह Date() कन्स्ट्रक्टर फ़ंक्शन द्वारा परिभाषित डिफ़ॉल्ट पैटर्न से डेट ऑब्जेक्ट्स जेनेरेट करता है।

इस बिंदु पर, आपको नेटिव कन्स्ट्रक्टर फ़ंक्शंस (उदा., new String('foo')) और यूजर द्वारा परिभाषित कन्स्ट्रक्टर फ़ंक्शंस (उदाहरण के लिए, new Person(true, 33, 'male') से ऑब्जेक्ट इंस्टेंस बनाने के साथ अच्छी तरह से परिचित होना चाहिए।

ध्यान रखें कि Math अन्य मेथड्स के लिए एक स्टेटिक ऑब्जेक्ट कंटेनर है और यह एक कन्स्ट्रक्टर नहीं है जो new ऑपरेटर का उपयोग करता है।


कन्स्ट्रक्टर से शार्टहैंड या लिट्रल वैल्यू बनाना

जावास्क्रिप्ट new Foo() या new Bar() का उपयोग किए बिना अधिकांश नेटिव ऑब्जेक्ट वैल्यूज के निर्माण के लिए शॉर्टकट्सकॉल "लिट्रल" प्रदान करता है। अधिकांश भाग के लिए, लिट्रल सिंटेक्स new ऑपरेटर का उपयोग करने के समान ही काम करता है। अपवाद हैं: Number(), String(), और Boolean() निम्नलिखित सैंपल के बाद नोट्स देखें।

यदि आप अन्य प्रोग्रामिंग बैकग्राउंड से आते हैं, तो आप ऑब्जेक्ट्स को बनाने के लिट्रल तरीके से अधिक परिचित हैं। निम्नलिखित नमूने में, मैं new ऑपरेटर का उपयोग करके नेटिव जावास्क्रिप्ट कन्स्ट्रक्टर को तुरंत चालू करता हूं और फिर इसी लिट्रल समकक्ष बना देता हूं।

सैंपल: sample11.html

आपको यहां ले जाने के लिए किस चीज की ज़रूरत है तथ्य यह है कि, सामान्य रूप से, लिटेरल्स का उपयोग करने से केवल new ऑपरेटर का उपयोग करने के समान अंतर्निहित प्रोसेस को छुपाया जाता है। शायद अधिक महत्वपूर्ण बात यह है कि यह अधिक सुविधाजनक है!

ठीक है, चीजें प्रिमिटिव स्ट्रिंग, नंबर, और बूलियन वैल्यूज के संबंध में थोड़ा अधिक जटिल हैं। इन मामलों में, लिट्रल वैल्यू जटिल ऑब्जेक्ट वैल्यूज के बजाय प्रिमिटिव वैल्यूज की विशेषताओं पर लेते हैं। फॉलो किये जाने वाले नोट्स को देखें।

String(), Number(), और Boolean() के लिए लिट्रल वैल्यूज का उपयोग करते समय, वास्तविक जटिल ऑब्जेक्ट तब तक नहीं बनाया जाता जब तक कि वैल्यू को ऑब्जेक्ट के रूप में नहीं माना जाता। दूसरे शब्दों में, आप एक प्राचीन डेटा टाइप से निपट रहे हैं जब तक कि आप मेथड्स का उपयोग करने या कन्स्ट्रक्टर से जुड़े प्रॉपर्टीज को रिट्रीव करने का प्रयास नहीं करते हैं (उदा., var charactersInFoo = 'foo'.length)। जब ऐसा होता है, तो जावास्क्रिप्ट सीन के पीछे लिट्रल वैल्यू के लिए एक रैपर ऑब्जेक्ट बनाता है, जिससे वैल्यू को ऑब्जेक्ट के रूप में माना जा सकता है। फिर, मेथड कहने के बाद, जावास्क्रिप्ट रैपर ऑब्जेक्ट को छोड़ देता है और वैल्यू एक लिट्रल टाइप पर रीटर्न है। यही कारण है कि स्ट्रिंग, नंबर, और बूलियन को प्रिमिटिव (या सिंपल) डेटा टाइप माना जाता है। मुझे आशा है कि यह गलत धारणा को स्पष्ट करता है "जावास्क्रिप्ट में सबकुछ एक ऑब्जेक्ट है" कांसेप्ट से "जावास्क्रिप्ट में सबकुछ एक ऑब्जेक्ट की तरह कार्य कर सकता है।"


प्रिमिटिव (aka सिंपल) वैल्यू

जावास्क्रिप्ट वैल्यूज 5, 'foo', true, और false, साथ ही null और undefined, प्रिमिटिव माना जाता है क्योंकि वे ईरेडूसेबल हैं। यह है, एक नंबर एक नंबर है, एक स्ट्रिंग एक स्ट्रिंग है, एक बूलियन या तो true या false है, और null और undefined बस, null और undefined हैं। ये वैल्यू स्वाभाविक रूप से सरल हैं और उन वैल्यूज का रिप्रेजेंट नहीं करते हैं जो अन्य वैल्यूज से बना सकते हैं।

निम्न कोड की जांच करें और खुद से पूछें कि क्या स्ट्रिंग, नंबर, बूलियन, null, और undefined वैल्यू अधिक जटिल हो सकते हैं। Object() उदाहरण, Array() इंस्टैंस, या वास्तव में किसी भी जटिल ऑब्जेक्ट के बारे में आप जो जानते हैं उसे इसके विपरीत बनाएं।

सैंपल: sample12.html

काफी सरलता से, प्रिमिटिव वैल्यू जावास्क्रिप्ट में उपलब्ध डेटा और जानकारी के निम्नतम रूप (यानी सबसे सरल) का प्रतिनिधित्व करते हैं।

लिट्रल सिंटेक्स के साथ वैल्यू बनाने के विरोध में, जब एक String(), Number(), या Boolean() वैल्यू new कीवर्ड का उपयोग करके बनाया जाता है, तो बनाया गया ऑब्जेक्ट वास्तव में एक जटिल ऑब्जेक्ट होती है।

यह महत्वपूर्ण है कि आप इस तथ्य को समझते हैं कि String(), Number(), और Boolean() कन्स्ट्रक्टर दोहरे उद्देश्य वाले कन्स्ट्रक्टर हैं जो लिट्रल/प्रिमिटिव वैल्यूज के साथ-साथ जटिल वैल्यू भी बनाते हैं। ये कन्स्ट्रक्टर हमेशा ऑब्जेक्ट्स को रीटर्न नहीं करते हैं, लेकिन इसके बजाय, जब "new" ऑपरेटर के बिना उपयोग किया जाता है, तो वास्तविक जटिल ऑब्जेक्ट वैल्यू का एक प्रिमिटिव रिप्रजेंटेशन रीटर्न कर सकता है।


प्रिमिटिव वैल्यू ऑब्जेक्ट्स नहीं हैं

null और undefined वैल्यू ऐसे छोटे वैल्यू हैं कि उन्हें एक कन्स्ट्रक्टर फ़ंक्शन की आवश्यकता नहीं होती है, न ही उन्हें new ऑपरेटर का उपयोग जावास्क्रिप्ट वैल्यू के रूप में एस्टेब्लिश करने के लिए किया जाता है। null या undefined का उपयोग करने के लिए, आप जो भी करते हैं, उनका उपयोग होता है जैसे कि वे एक ऑपरेटर थे। शेष प्रिमिटिव वैल्यूस्ट्रिंग, नंबर, और बूलियनवाइल तकनीकी रूप से एक कन्स्ट्रक्टर फ़ंक्शन से रीटर्न, ऑब्जेक्ट्स नहीं हैं।

निम्नलिखित सैंपल में, मैं प्रिमिटिव वैल्यूज और शेष नेटिव जावास्क्रिप्ट ऑब्जेक्ट्स के बीच कंट्रास्ट को विपरीत करता हूं।

सैंपल: sample13.html

पिछले कोड उदाहरण से मैं आपको क्या सीखना चाहता हूं यह है कि प्रिमिटिव वैल्यू ऑब्जेक्ट्स नहीं हैं। प्रिमिटिव वैल्यू विशेष हैं कि इन्हें सरल वैल्यूज का प्रतिनिधित्व करने के लिए उपयोग किया जाता है।


कैसे जावास्क्रिप्ट में प्रिमिटिव वैल्यू स्टोर/कॉपी किया जाता है

यह समझना बेहद जरूरी है कि प्रिमिटिव वैल्यूज को "फेस वैल्यू पर स्टोर और मैनिपुलेट की जाती है। यह आसान लग सकता है, लेकिन इसका मतलब यह है कि यदि मैं स्ट्रिंग वैल्यू" foo "को myString नामक वेरिएबल में स्टोर करता हूं, तो वैल्यू "foo" शब्दशः है इस तरह मेमोरी में स्टोर होता है। यह महत्वपूर्ण क्यों है? एक बार जब आप वैल्यूज को जोड़ना शुरू कर देते हैं (उदाहरण के लिए, कॉपी बनाना) वैल्यू, आपको इस ज्ञान से लैस होना चाहिए, क्योंकि प्रिमिटिव वैल्यूज को सचमुच कॉपी किया गया है।

निम्नलिखित उदाहरण में, हम वेरिएबल myStringCopy में myString वैल्यू ('foo') की कॉपी स्टोर करते हैं, और इसका वैल्यू सचमुच कॉपी किया गया है। यहां तक कि यदि हम ओरिजिनल वैल्यू को बदलते हैं, तो कॉपी बनाई गई वैल्यू, वेरिएबल myStringCopy द्वारा रिफरेन्स, अनचेंज बनी हुई है।

सैंपल: sample14.html

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


प्रिमिटिव वैल्यूज वैल्यू के बराबर हैं

प्रिमिटिव की तुलना यह देखने के लिए की जा सकती है कि उनके वैल्यू सचमुच समान हैं या नहीं। चूंकि लॉजिक सजेस्ट करेगा, यदि आप न्यूमेरिक वैल्यू 10 वाले वैरिएबल की तुलना करते हैं तो न्यूमेरिक वैल्यू 10 युक्त अन्य वेरिएबल के साथ, जावास्क्रिप्ट इन बराबर मानेंगे क्योंकि 10 10 के समान है (यानी 10 === 10)। वही, ज़ाहिर है, यदि आप 'foo' के वैल्यू के साथ प्रिमिटिव स्ट्रिंग 'foo' की तुलना किसी अन्य प्रिमिटिव स्ट्रिंग से करते हैं तो लागू होगा। तुलना कहती है कि वे एक दूसरे के बराबर हैं उनके वैल्यू के आधार पर (यानी 'foo' === 'foo')।

निम्नलिखित कोड में, मैं प्रिमिटिव नंबर्स का उपयोग करके "वैल्यू के आधार पर" कांसेप्ट का प्रदर्शन करता हूं, साथ ही जटिल नंबर ऑब्जेक्ट के साथ इसके विपरीत भी करता हूं।

सैंपल: sample15.html

यहां ले जाने की अवधारणा यह है कि तुलनात्मक, जब तुलना की जाती है, तो यह देखने के लिए जांच की जाएगी कि व्यक्त वैल्यू बराबर हैं या नहीं। जब कोई स्ट्रिंग, नंबर, या बूलियन वैल्यू new कीवर्ड (उदा., new Number('10 ')) का उपयोग करके बनाया जाता है, तो वैल्यू अब प्रिमिटिव नहीं होती है। इस प्रकार, तुलना समान काम नहीं करती है जैसे कि लिट्रल सिंटेक्स के माध्यम से वैल्यू बनाया गया था। यह आश्चर्यजनक नहीं है, यह देखते हुए कि प्रिमिटिव वैल्यू वैल्यू से स्टोर होते हैं (यानी 10 === 10), जबकि जटिल वैल्यू रिफरेन्स द्वारा स्टोर किए जाते हैं (यानी price3 और price4 में एक ही वैल्यू का रिफरेन्स होता है)।


जब ऑब्जेक्ट्स की तरह प्रयोग किया जाता है तो स्ट्रिंग, नंबर, बूलियन प्रिमिटिव वैल्यू ऑब्जेक्ट की तरह एक्ट करती है

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

सैंपल: sample16.html

इस कोड उदाहरण में, सभी प्रिमिटिव वैल्यूज (null और undefined को छोड़कर) को ऑब्जेक्ट्स में परिवर्तित कर दिया जाता है, ताकि toString() मेथड का लाभ उठाने के लिए, और मेथड लागू होने और रीटर्न करने के बाद प्रिमिटिव वैल्यूज पर वापस आ जाए।


काम्प्लेक्स (aka कम्पोज़िट) वैल्यू

नेटिव ऑब्जेक्ट कन्स्ट्रक्टर Object(), Array(), Function(), Date(), Error(), और RegExp() जटिल हैं क्योंकि उनमें एक या अधिक प्रिमिटिव या काम्प्लेक्स वैल्यू हो सकते हैं। अनिवार्य रूप से, काम्प्लेक्स वैल्यू कई प्रकार के जावास्क्रिप्ट ऑब्जेक्ट्स से बना सकते हैं। यह कहा जा सकता है कि काम्प्लेक्स ऑब्जेक्ट्स में मेमोरी में अज्ञात आकार होता है क्योंकि काम्प्लेक्स ऑब्जेक्ट्स में कोई वैल्यू हो सकती है, न कि स्पेसिफिक जानने वाली वैल्यू। निम्नलिखित कोड में, हम एक ऑब्जेक्ट और एक ऐरे बनाते हैं जिसमें सभी प्रिमिटिव ऑब्जेक्ट्स होते हैं।

सैंपल: sample17.html

यहां ले जाने का कांसेप्ट यह है कि काम्प्लेक्स वैल्यू वैल्यूज का एक कम्पोजिट होते हैं और काम्प्लेक्स वैल्यूज और कम्पोजीशन वैल्यूज में भिन्न होते हैं।

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


जावास्क्रिप्ट में काम्प्लेक्स वैल्यू कैसे स्टोर/कॉपी किए जाते हैं

यह समझना बेहद जरूरी है कि काम्प्लेक्स वैल्यूज रिफरेन्स के द्वारा स्टोर और मैनिपुलेट की जाती है। एक काम्प्लेक्स ऑब्जेक्ट युक्त एक वेरिएबल बनाने के दौरान, वैल्यू को मेमोरी में स्टोर किया जाता है। जब आप किसी काम्प्लेक्सऑब्जेक्ट को रिफरेन्स करते हैं, तो आप मेमोरी में उस एड्रेस पर वैल्यू रिट्रीव करने के लिए इसका नाम (यानी वेरिएबल या ऑब्जेक्ट प्रॉपर्टी) का उपयोग कर रहे हैं। जब आप काम्प्लेक्स वैल्यू की कॉपी बनाने का प्रयास करते हैं तो क्या होता है जब आप विचार करते हैं तो प्रभाव महत्वपूर्ण होते हैं। अगले सैंपल में, हम वैरिएबल myObject में स्टोर ऑब्जेक्ट बनाते हैं। myObject में वैल्यू को वेरिएबल copyOfMyObject पर कॉपी किया गया है। वास्तव में, यह ऑब्जेक्ट की एक कॉपी नहीं है - ऑब्जेक्ट के एड्रेस की एक कॉपी की तरह।

सैंपल: sample18.html

आपको यह समझने की आवश्यकता है कि, एक वैल्यू की कॉपी बनाने वाले प्रिमिटिव वैल्यूज के विपरीत, ऑब्जेक्ट्स (aka काम्प्लेक्स वैल्यू) रिफरेन्स द्वारा स्टोर किए जाते हैं। इस प्रकार, रिफरेन्स (aka एड्रेस) की कॉपी बनाई गई है, लेकिन वास्तविक वैल्यू नहीं है। इसका मतलब है कि ऑब्जेक्ट्स की कॉपी बनाई गई नहीं है। जैसे मैंने कहा, कॉपी किया गया है मेमोरी स्टैक में ऑब्जेक्ट का पता या रिफरेन्स है। हमारे कोड एक्साम्प्ल में, myObject और copyOfMyObject मेमोरी में स्टोर उसी ऑब्जेक्ट को इंगित करता है।

यहां ले जाने का विचार यह है कि जब आप एक काम्प्लेक्स वैल्यू बदलते हैं तो यह रिफरेन्स द्वारा स्टोर किया जाता है आप काम्प्लेक्स वेरिएबल का रिफरेन्स देने वाले सभी वेरिएबल्स में स्टोर्ड वैल्यू को बदलते हैं। हमारे कोड उदाहरण में, जब आप किसी भी वरेबले में स्टोर ऑब्जेक्ट को अपडेट करते हैं तो myObject और copyOfMyObject दोनों बदल जाते हैं।

जब वैल्यू String(), Number(), और Boolean() new कीवर्ड का उपयोग करके बनाए जाते हैं, या सीन के पीछे काम्प्लेक्स ऑब्जेक्ट्स में परिवर्तित होते हैं, तो वैल्यूज को वैल्यू द्वारा स्टोर/कॉपी बनाते रहेंगे। इसलिए, हालांकि प्रिमिटिव वैल्यूज को काम्प्लेक्स वैल्यूज के रूप में माना जा सकता है, फिर भी वे रिफरेन्स द्वारा कॉपी की गुणवत्ता को नहीं लेते हैं।

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


काम्प्लेक्स ऑब्जेक्ट्स रिफरेन्स के बराबर हैं

काम्प्लेक्स ऑब्जेक्ट्स की तुलना करते समय, वे केवल तभी होते हैं जब वे एक ही ऑब्जेक्ट का रिफरेन्स देते हैं (यानी एक ही एड्रेस है)। समान ऑब्जेक्ट्स वाले दो वेरिएबल एक दूसरे के बराबर नहीं हैं क्योंकि वे वास्तव में एक ही ऑब्जेक्ट पर इंगित नहीं करते हैं।

निम्नलिखित नमूने में, objectFoo और objectBar में वही प्रॉपर्टीज हैं और वास्तव में, समान ऑब्जेक्ट्स हैं, लेकिन जब उनसे पूछा गया कि वे === से बराबर हैं, तो जावास्क्रिप्ट हमें बताता है कि वे नहीं हैं।

सैंपल: sample19.html

यहां ले जाने का कांसेप्ट यह है कि मेमोरी में काम्प्लेक्स ऑब्जेक्ट को इंगित करने वाले वेरिएबल केवल समान हैं क्योंकि वे समान "address" का उपयोग कर रहे हैं। इसके विपरीत, दो स्वतंत्र रूप से बनाए गए ऑब्जेक्ट समान नहीं हैं, भले ही वे एक ही प्रकार के हों और पास हों सटीक वही प्रॉपर्टीज हो।


काम्प्लेक्स ऑब्जेक्ट्स में डायनामिक प्रॉपर्टीज हैं

एक नया वेरिएबल जो किसी मौजूदा काम्प्लेक्स ऑब्जेक्ट को इंगित करता है वह ऑब्जेक्ट की कॉपी नहीं करता है। यही कारण है कि काम्प्लेक्स ऑब्जेक्ट्स को कभी-कभी रिफरेन्स ऑब्जेक्ट्स कहा जाता है। एक काम्प्लेक्स ऑब्जेक्ट में जितना चाहें उतने रिफरेन्स हो सकते हैं, और वे हमेशा उसी ऑब्जेक्ट को रिफरेन्स करेंगे, भले ही ऑब्जेक्ट में रिफरेन्स को परिवर्तित किया जा सके।

सैंपल: sample20.html

यह डायनामिक ऑब्जेक्ट प्रॉपर्टीज की अनुमति देता है क्योंकि आप किसी ऑब्जेक्ट को परिभाषित कर सकते हैं, रिफरेन्स बना सकते हैं, ऑब्जेक्ट अपडेट कर सकते हैं, और ऑब्जेक्ट का जिक्र करने वाले सभी वेरिएबल उस अपडेट को "get" करेंगे।


प्रिमिटिव और काम्प्लेक्स वैल्यूज पर प्रयुक्त typeof ऑपरेटर

typeof ऑपरेटर का उपयोग उस प्रकार के वैल्यू को वापस करने के लिए किया जा सकता है, जिसके साथ आप काम कर रहे हैं। लेकिन इससे रीटर्न की गयी वैल्यू बिल्कुल कंसिस्टेंट नहीं हैं या कुछ लोग क्या कह सकते हैं, लॉजिकल। निम्न कोड टाइप की गयी वैल्यूज को typeof ऑपरेटर का उपयोग करके प्रदर्शित करता है।

सैंपल: sample21.html

वैल्यूज पर इस ऑपरेटर का उपयोग करते समय, आपको उस वैल्यू के टाइप (प्रिमिटिव या काम्प्लेक्स) के साथ दी गयी संभावित वैल्यूज से अवगत होना चाहिए जिनके साथ आप काम कर रहे हैं।


डायनामिक प्रॉपर्टीज म्यूटेबल ऑब्जेक्ट्स के लिए अनुमति देती है

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

इसका मतलब यह है कि नेटिव constructor पर प्रॉपर्टीज को स्टोर करना संभव है और नेटिव प्रोटोकॉल ऑब्जेक्ट्स के साथ नेटिव ऑब्जेक्ट्स में नए मेथड्स जोड़ना संभव है।

निम्नलिखित कोड में, मैं String() कन्स्ट्रक्टर फ़ंक्शन और String.prototype को बदलता हूं।

सैंपल: sample22.html

मैं होम को इस तथ्य को ड्राइव करना चाहता हूं कि जावास्क्रिप्ट में ऑब्जेक्ट्स डायनामिक हैं। यह जावास्क्रिप्ट में ऑब्जेक्ट्स को मयूटेट करने की अनुमति देता है। अनिवार्य रूप से, पूरी लैंग्वेज को एक कस्टम वर्जन में परिवर्तित किया जा सकता है (उदा., trimIT स्ट्रिंग मेथड)। दोबारा, मैं इसकी सिफारिश नहीं कर रहा हूं। मैं सिर्फ यह इंगित कर रहा हूं कि यह जावास्क्रिप्ट में ऑब्जेक्ट्स की नेचर का हिस्सा है।

सावधान! यदि आप जावास्क्रिप्ट के नेटिव आंतरिक कार्यों को बदलते हैं, तो आपके पास संभावित रूप से जावास्क्रिप्ट का एक कस्टम वर्जन है। सावधानी के साथ आगे बढ़ें, क्योंकि ज्यादातर लोग वैल्यू लेंगे कि जावास्क्रिप्ट कहीं भी उपलब्ध है।


सभी कन्स्ट्रक्टर के उदाहरणों में कन्स्ट्रक्टर प्रॉपर्टीज होती हैं जो उनके कन्स्ट्रक्टर फ़ंक्शन को इंगित करते हैं

जब कोई ऑब्जेक्ट इंस्टैंशियेट होता है, तो उस ऑब्जेक्ट या इंस्टेंस की प्रॉपर्टी के रूप में सीन के पीछे constructor प्रॉपर्टी बनाई जाती है। यह प्रॉपर्टी उस कन्स्ट्रक्टर फ़ंक्शन को इंगित करता है जिसने ऑब्जेक्ट बनाया है। अगले कोड सैंपल में, हम foo वेरिएबल में स्टोर Object() ऑब्जेक्ट बनाते हैं, और उसके बाद यह वेरीफाई करते हैं कि constructor प्रॉपर्टी हमारे द्वारा बनाए गए ऑब्जेक्ट के लिए उपलब्ध है।

सैंपल: sample23.html

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

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

सैंपल: sample24.html

constructor प्रॉपर्टी यूजर द्वारा परिभाषित कन्स्ट्रक्टर फ़ंक्शंस पर भी काम करती है। निम्नलिखित सैंपल में, हम एक CustomConstructor() कन्स्ट्रक्टर फ़ंक्शन को परिभाषित करते हैं, फिर new कीवर्ड का उपयोग करके, हम ऑब्जेक्ट को प्रोडूस करने के लिए फ़ंक्शन को इनवॉक करते हैं। एक बार हमारे पास ऑब्जेक्ट हो जाने के बाद, हम constructor प्रॉपर्टी का लाभ उठा सकते हैं।

सैंपल: sample25.html

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

यदि आप constructor प्रॉपर्टी को यूजर द्वारा परिभाषित कन्स्ट्रक्टर फ़ंक्शंस के लिए कन्स्ट्रक्टर के वास्तविक नाम को लॉग करना चाहते हैं, तो आपको कन्स्ट्रक्टर को वास्तविक नाम देना होगा (उदा., var Person = function Person () {};)।


वेरीफाई करें कि ऑब्जेक्ट एक विशेष कन्स्ट्रक्टर फ़ंक्शन का एक इंस्टैंस है

instanceof ऑपरेटर का उपयोग करके, यदि कोई ऑब्जेक्ट किसी विशेष कन्स्ट्रक्टर फ़ंक्शन का इंस्टैंस है, तो हम (true या false) निर्धारित कर सकते हैं।

अगले सैंपल में, हम वेरीफाई कर रहे हैं कि ऑब्जेक्ट InstanceOfCustomObject CustomConstructor कन्स्ट्रक्टर फ़ंक्शन का इंस्टैंस है। यह यूजर द्वारा परिभाषित ऑब्जेक्ट्स के साथ-साथ new ऑपरेटर के साथ बनाई गई नेटिव ऑब्जेक्ट्स के साथ काम करता है।

सैंपल: sample26.html

ध्यान देने लायक एक चीज जब instanceof ऑपरेटर के साथ डील करते है की यह जब कभी भी इसे पूछा जाए तो यह true रीटर्न करेगा यदि ऑब्जेक्ट Object का एक इंस्टैंस हो, क्योंकि सभी ऑब्जेक्ट Object() कन्स्ट्रक्टर से प्राप्त होते हैं।

instanceof ऑपरेटर false रीटर्न करेगा जब ऑब्जेक्ट रैपर का लाभ उठाने वाले प्रिमिटिव वैल्यूज से निपटने (उदा., 'foo' instanceof String // returns false)। यदि new ऑपरेटर के साथ स्ट्रिंग 'foo' बनाया गया था, तो instanceof ऑपरेटर true रीटर्न आ गया होगा। इसलिए, ध्यान रखें कि instanceof वास्तव में केवल काम्प्लेक्स ऑब्जेक्ट्स और कन्स्ट्रक्टर फंक्शन्स से बनाए गए इंस्टैंस के साथ काम करता है जो ऑब्जेक्ट रीटर्न करता हैं।


एक कन्स्ट्रक्टर से बनाया गया एक इंस्टैंस अपने स्वयं के इंडिपेंडेंट प्रॉपर्टीज हो सकती है (Aka इंस्टेंस प्रॉपर्टीज)

जावास्क्रिप्ट में, ऑब्जेक्ट्स को किसी भी समय बढ़ाया जा सकता है (यानी डायनामिक प्रॉपर्टीज)। जैसा कि पहले उल्लेख किया गया है, और सटीक होने के लिए, जावास्क्रिप्ट में डायनामिक ऑब्जेक्ट्स हैं। इसका मतलब है कि एक कन्स्ट्रक्टर फ़ंक्शन से बनाए गए ऑब्जेक्ट्स को प्रॉपर्टीज के साथ बढ़ाया जा सकता है।

निम्नलिखित कोड सैंपल में, मैं Array() कन्स्ट्रक्टर से एक इंस्टैंस बनाता हूं और फिर इसे अपनी प्रॉपर्टी के साथ बढ़ाता हूं।

सैंपल: sample27.html

यह Object(), RegExp(), या अन्य नॉन-प्रिमिटिव कन्स्ट्रक्टर-यहां तक कि Boolean() के साथ भी किया जा सकता है।

सैंपल: sample28.html

कभी-कभी कन्स्ट्रक्टर फ़ंक्शन से बनाए गए ऑब्जेक्ट्स में प्रॉपर्टीज जोड़ना होता है। याद रखें, कन्स्ट्रक्टर फ़ंक्शंस से बनाए गए ऑब्जेक्ट इंस्टेंस केवल प्लेन पुराने ऑब्जेक्ट्स हैं।

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


"जावास्क्रिप्ट ऑब्जेक्ट्स" और " Object() ऑब्जेक्ट्स" के सेमेन्टिक्स

सामान्य शब्द "जावास्क्रिप्ट ऑब्जेक्ट्स" से भ्रमित न हो, जो Object() ऑब्जेक्ट्स के साथ जावास्क्रिप्ट में ऑब्जेक्ट्स के कांसेप्ट को रिफरेन्स करता है। एक Object() ऑब्जेक्ट (उदा., var myObject = new Object()) जावास्क्रिप्ट में व्यक्त एक बहुत ही विशिष्ट प्रकार का वैल्यू है। जैसे एक Array() ऑब्जेक्ट ऐरे नामक ऑब्जेक्ट का एक प्रकार है, Object() ऑब्जेक्ट नामक ऑब्जेक्ट का एक प्रकार है। संक्षेप यह है कि Object() कन्स्ट्रक्टर फ़ंक्शन एक खाली जेनेरिक ऑब्जेक्ट कंटेनर जेनेरेट करता है, जिसे Object() ऑब्जेक्ट के रूप में जाना जाता है। इसी प्रकार, Array() कन्स्ट्रक्टर फ़ंक्शन एक ऐरे ऑब्जेक्ट जेनेरेट करता है, और हम इन ऑब्जेक्ट्स को Array() ऑब्जेक्ट्स के रूप में रेफेर करते हैं।

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


निष्कर्ष

आपको याद रखने की आवश्यकता है कि Object() ऑब्जेक्ट एक बहुत ही विशिष्ट प्रकार की वैल्यू है। यह एक सामान्य खाली ऑब्जेक्ट है। इसे "जावास्क्रिप्ट ऑब्जेक्ट्स" शब्द के साथ भ्रमित न करें जो अधिकांश वैल्यूज को रेफेर करता है जिन्हें जावास्क्रिप्ट में ऑब्जेक्ट के रूप में व्यक्त किया जा सकता है।

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.