JavaScript में रिफ्लेक्शन और इंट्रोस्पेक्शन क्या है और यह आपके लिए क्यों ज़रूरी है?
\n\nकल्पना कीजिए कि आप एक प्रोग्रामर-जासूस हैं। आपके पास एक ऑब्जेक्ट है, लेकिन आप नहीं जानते कि उसके अंदर क्या है। उसके पास कौन से प्रॉपर्टीज़ हैं? वह किस प्रकार का है — array, function, या सिर्फ डेटा का एक समूह? सामान्य जीवन में हम सिर्फ कोड देखते हैं, लेकिन JavaScript की डायनामिक दुनिया में आपका प्रोग्राम खुद यह करने में सक्षम होना चाहिए। इसे ही रिफ्लेक्शन और इंट्रोस्पेक्शन कहते हैं।
\n\nये शब्द दर्शनशास्त्र जैसे लगते हैं, लेकिन असल में ये शक्तिशाली टूल्स हैं। इंट्रोस्पेक्शन का मतलब है जब कोड खुद को देखता है: वेरिएबल का टाइप चेक करना, फंक्शन का नाम पता करना, या ऑब्जेक्ट के प्रॉपर्टीज़ को लिस्ट करना। रिफ्लेक्शन इससे आगे जाता है — यह कोड की रनटाइम पर खुद को बदलने की क्षमता है: नए मेथड जोड़ना, प्रोटोटाइप बदलना, या Proxy ऑब्जेक्ट बनाना।
\n\nपहली नज़र में ऐसा लग सकता है कि यह सिर्फ जटिल फ्रेमवर्क बनाने वालों के लिए है। लेकिन असल में, आप हर दिन इंट्रोस्पेक्शन का उपयोग करते हैं, भले ही आपको पता न हो। जब आप typeof x === 'string' लिखते हैं — तो आप इंट्रोस्पेक्शन कर रहे हैं। और जब आप प्रॉपर्टीज़ कॉपी करने के लिए Object.assign का उपयोग करते हैं — तो आप रिफ्लेक्शन लागू कर रहे हैं।
इस लेख में हम सभी मुख्य मेथड और तकनीकों को समझेंगे। आप सीखेंगे कि किसी भी ऑब्जेक्ट के 'अंदर कैसे झांकें', अज्ञात डेटा के साथ सुरक्षित रूप से कैसे काम करें, और अधिक लचीला और अनुकूल कोड कैसे लिखें। चलिए शुरू करते हैं!
\n\nइंट्रोस्पेक्शन की मूल बातें: देखें कि हमारे पास क्या है
\n\nइंट्रोस्पेक्शन एक सरल प्रश्न से शुरू होता है: "यह क्या है?"। JavaScript में कई बिल्ट-इन ऑपरेटर और मेथड हैं जो इस प्रश्न का उत्तर देने में मदद करते हैं।
\n\ntypeof ऑपरेटर: त्वरित टाइप जांच
\n\nयह आपका पहला सहायक है। typeof एक स्ट्रिंग लौटाता है जो ऑपरेंड के टाइप को इंगित करता है। यह सरल है, लेकिन इसमें कुछ खामियां हैं।
console.log(typeof 42); // "number"\nconsole.log(typeof 'hello'); // "string"\nconsole.log(typeof true); // "boolean"\nconsole.log(typeof undefined); // "undefined"\nconsole.log(typeof null); // "object" — यह रहा मशहूर बग!\nconsole.log(typeof []); // "object" — यह बग नहीं, बल्कि एक फीचर है\nconsole.log(typeof function(){}); // "function"\n\nध्यान दें: typeof null "object" लौटाता है। यह JavaScript की एक ऐतिहासिक गलती है जिसे अब ठीक नहीं किया जाएगा। typeof [] भी "object" लौटाता है, जो तार्किक है क्योंकि array ऑब्जेक्ट का एक उपप्रकार है। लेकिन फिर array को सामान्य ऑब्जेक्ट से कैसे अलग करें? इसके लिए अन्य टूल्स हैं।
एक उपयोगी टिप: typeof यह जांचने के लिए एकदम सही है कि कोई वेरिएबल परिभाषित है या नहीं, बिना ReferenceError एरर के जोखिम के।
if (typeof someGlobalVar !== 'undefined') {\n // सुरक्षित रूप से someGlobalVar का उपयोग करें\n}\n\ninstanceof: प्रोटोटाइप चेन की जांच
\n\nअगर typeof "यह किस प्रिमिटिव टाइप का है?" प्रश्न का उत्तर देता है, तो instanceof "क्या यह किसी विशेष क्लास का ऑब्जेक्ट है?" प्रश्न का उत्तर देता है। यह जांचता है कि कंस्ट्रक्टर का प्रोटोटाइप ऑब्जेक्ट की प्रोटोटाइप चेन में मौजूद है या नहीं।
const arr = [1, 2, 3];\nconsole.log(arr instanceof Array); // true\nconsole.log(arr instanceof Object); // true — क्योंकि Array, Object से इनहेरिट करता है\n\nconst date = new Date();\nconsole.log(date instanceof Date); // true\nconsole.log(date instanceof Object); // true\n\n// लेकिन प्रिमिटिव के साथ काम नहीं करता\nconsole.log('hello' instanceof String); // false — प्रिमिटिव ऑब्जेक्ट नहीं है\n\nएक महत्वपूर्ण बारीकी: instanceof iframe या अलग-अलग execution कॉन्टेक्स्ट (जैसे Node.js) के साथ काम करते समय गलत परिणाम दे सकता है। प्रत्येक कॉन्टेक्स्ट का अपना ग्लोबल ऑब्जेक्ट होता है, और [] instanceof window.Array false लौटा सकता है यदि array किसी दूसरे फ्रेम में बनाया गया हो। ऐसे मामलों के लिए Array.isArray() का उपयोग करना बेहतर है।