paint-brush
जावास्क्रिप्ट में प्रॉक्सी की शक्ति को समझनाद्वारा@aleksandrguzenko
6,221 रीडिंग
6,221 रीडिंग

जावास्क्रिप्ट में प्रॉक्सी की शक्ति को समझना

द्वारा Aleksandr Guzenko9m2023/03/29
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

जावास्क्रिप्ट की प्रॉक्सी एक क्षमता है जो अन्य वस्तुओं पर किए गए बुनियादी कार्यों को संशोधित और अनुकूलित करने में सक्षम वस्तुओं के निर्माण की अनुमति देती है। एक प्रॉक्सी एक ऐसी वस्तु है जो किसी अन्य वस्तु को घेर लेती है और उस पर बुनियादी संचालन को रोकती है, जैसे कि एक्सेस करना, असाइन करना और हटाना। यह लेख जावास्क्रिप्ट में प्रॉक्सी की क्षमताओं पर चर्चा करता है, इसके सिंटैक्स, विशेषताओं, विशिष्ट अनुप्रयोगों, शक्तियों, सीमाओं और अनुशंसित दृष्टिकोणों को कवर करता है।
featured image - जावास्क्रिप्ट में प्रॉक्सी की शक्ति को समझना
Aleksandr Guzenko HackerNoon profile picture
0-item

वर्षों से, जावास्क्रिप्ट एक शक्तिशाली और अनुकूलनीय प्रोग्रामिंग भाषा के रूप में विकसित हुई है, जो डेवलपर्स की बदलती जरूरतों को पूरा करने के लिए लगातार विकसित हो रही है।


इसकी अपेक्षाकृत हालिया प्रगति में से एक प्रॉक्सी ऑब्जेक्ट है, जो प्रोग्रामर को शक्तिशाली और लचीली वस्तुओं को बनाने में सक्षम बनाता है जो अन्य वस्तुओं पर प्रमुख संचालन को बाधित करने और संशोधित करने में सक्षम हैं।


यह लेख जावास्क्रिप्ट में प्रॉक्सी की क्षमताओं पर चर्चा करता है, इसके सिंटैक्स, विशेषताओं, विशिष्ट अनुप्रयोगों, शक्तियों, सीमाओं, उदाहरणों और अनुशंसित दृष्टिकोणों को कवर करता है।


प्रॉक्सी क्या है?

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


इस लेख का लक्ष्य जावास्क्रिप्ट में प्रॉक्सी की व्यापक समझ प्रदान करना है, जिसमें इसके सिंटैक्स, विशेषताओं, लाभों, कमियों, उदाहरणों और अनुशंसित तकनीकों को शामिल किया गया है।

प्रॉक्सी का सिंटैक्स और गुण

जावास्क्रिप्ट की प्रॉक्सी एक क्षमता है जो अन्य वस्तुओं पर किए गए बुनियादी कार्यों को संशोधित और अनुकूलित करने में सक्षम वस्तुओं के निर्माण की अनुमति देती है।


एक प्रॉक्सी वस्तु बनाना

प्रॉक्सी ऑब्जेक्ट स्थापित करने के लिए, दो घटक आवश्यक हैं: लक्ष्य ऑब्जेक्ट और हैंडलर ऑब्जेक्ट। टारगेट ऑब्जेक्ट वह है जिस पर ऑपरेशंस को इंटरसेप्ट किया जाना है, जबकि हैंडलर ऑब्जेक्ट इन ऑपरेशंस को पकड़ने के लिए इस्तेमाल किए जाने वाले ट्रैप या मेथड्स को होल्ड करने के लिए जिम्मेदार होता है।


यहां एक उदाहरण दिखाया गया है कि मूल प्रॉक्सी ऑब्जेक्ट कैसे बनाया जाए:

 const target = { name: 'John', age: 25, }; const handler = { get: function(target, prop) { console.log(`Getting property ${prop}`); return target[prop]; }, }; const proxy = new Proxy(target, handler); console.log(proxy.name); // Getting property name // John


इस उदाहरण में, हम एक लक्ष्य वस्तु उत्पन्न करते हैं जिसमें दो विशेषताएँ होती हैं: नाम और आयु। हम एक हैंडलर ऑब्जेक्ट भी उत्पन्न करते हैं जिसमें लक्ष्य वस्तु पर किसी संपत्ति को पढ़ने के किसी भी प्रयास को पकड़ने के लिए जाल होता है। उसके बाद, हम प्रॉक्सी कंस्ट्रक्टर को लक्ष्य और हैंडलर ऑब्जेक्ट प्रदान करके एक प्रॉक्सी ऑब्जेक्ट बनाते हैं। अंत में, हम प्रॉक्सी ऑब्जेक्ट की नाम संपत्ति को पुनः प्राप्त करते हैं, जो गेट ट्रैप को आमंत्रित करता है और कंसोल को एक संदेश आउटपुट करता है।


जाल और उनका व्यवहार



जाल वे विधियाँ हैं जो लक्ष्य वस्तु पर संचालन को रोकती हैं। ऐसे कई ट्रैप हैं जिनका उपयोग आप प्रॉक्सी ऑब्जेक्ट के साथ कर सकते हैं, जिनमें गेट, सेट, है, डिलीटप्रॉपर्टी और बहुत कुछ शामिल हैं।


यहाँ सबसे अधिक उपयोग किए जाने वाले कुछ जालों का संक्षिप्त विवरण दिया गया है:


  1. get : यह ट्रैप टारगेट ऑब्जेक्ट पर किसी प्रॉपर्टी को पढ़ने की कोशिश को इंटरसेप्ट करता है। इसमें दो तर्क होते हैं: लक्ष्य वस्तु और संपत्ति का उपयोग किया जा रहा है। जाल संपत्ति का मूल्य लौटाता है।


  2. सेट : यह जाल लक्षित वस्तु पर संपत्ति स्थापित करने के किसी भी प्रयास को पकड़ लेता है। इसके लिए तीन मापदंडों की आवश्यकता होती है: लक्ष्य वस्तु ही, वह संपत्ति जो स्थापित की जा रही है, और उस संपत्ति का अद्यतन मूल्य। तंत्र में स्थापित होने वाले मूल्य को बदलने की क्षमता है, या यह मूल्य को स्थापित होने से रोकने के लिए त्रुटि उत्पन्न कर सकता है।


  3. है : यह ट्रैप यह जाँचने के प्रयासों को रोकता है कि लक्ष्य वस्तु पर कोई संपत्ति मौजूद है या नहीं। इसमें दो तर्क होते हैं: लक्षित वस्तु और संपत्ति की जांच की जा रही है। जाल एक बूलियन मान लौटाता है जो दर्शाता है कि संपत्ति मौजूद है या नहीं।


  4. डिलीटप्रॉपर्टी : यह ट्रैप टारगेट ऑब्जेक्ट से प्रॉपर्टी को डिलीट करने के प्रयासों को इंटरसेप्ट करता है। इसमें दो तर्क होते हैं: लक्षित वस्तु और संपत्ति को हटाया जा रहा है। जाल संपत्ति को हटा सकता है या संपत्ति को हटाए जाने से रोकने के लिए एक त्रुटि फेंक सकता है।


वापस लेने योग्य प्रॉक्सी

प्रॉक्सी वस्तुओं में एक आकर्षक विशेषता होती है जो उन्हें अमान्य करने की अनुमति देती है, जिसके परिणामस्वरूप उनके जाल अब लक्ष्य वस्तु पर इंटरसेप्टिंग ऑपरेशन नहीं करते हैं। एक प्रॉक्सी ऑब्जेक्ट बनाने के लिए जिसे अमान्य किया जा सकता है, Proxy.revocable() फ़ंक्शन का उपयोग करें।


यहाँ एक उदाहरण है:

 const target = { name: 'John', age: 25, }; const handler = { get: function(target, prop) { console.log(`Getting property ${prop}`); return target[prop]; }, }; const {proxy, revoke} = Proxy.revocable(target, handler); console.log(proxy.name); // Getting property name // John revoke(); console.log(proxy.name); // Uncaught TypeError: Cannot perform 'get' on a proxy that has been revoked


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


प्रॉक्सी के साथ विरासत

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


यहाँ एक उदाहरण है:

 const parent = { name: 'John', }; const handler = { get: function(target, prop) { console.log(`Getting property ${prop}`); if (!(prop in target)) { return Reflect.get(parent, prop); } return target[prop]; }, }; const child = new Proxy({}, handler); console.log(child.name); // Getting property name // John child.name = 'Bob'; console.log(child.name); // Getting property name // Bob console.log(parent.name); // John


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


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

प्रॉक्सी का उपयोग करते हुए वास्तविक जीवन के उदाहरण

कैशिंग

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

 function calculateCost(price, taxRate) { console.log('Calculating cost...'); return price * (1 + taxRate); } const cache = new Map(); const proxy = new Proxy(calculateCost, { apply(target, thisArg, args) { const key = args.join('-'); if (cache.has(key)) { console.log('Returning cached result...'); return cache.get(key); } else { const result = Reflect.apply(target, thisArg, args); cache.set(key, result); return result; } }, }); console.log(proxy(10, 0.2)); // Calculating cost... 12 console.log(proxy(10, 0.2)); // Returning cached result... 12 console.log(proxy(20, 0.2)); // Calculating cost... 24 console.log(proxy(20, 0.3)); // Calculating cost... 26 console.log(proxy(20, 0.3)); // Returning cached result... 26

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


इसके बाद, हम एक प्रॉक्सी ऑब्जेक्ट बनाते हैं जिसे proxy कहा जाता है जो apply ट्रैप का उपयोग करके फ़ंक्शन कॉल को इंटरसेप्ट करता है। जब भी फ़ंक्शन को कॉल किया जाता है, तो apply ट्रैप को कॉल किया जाता है, और यह फ़ंक्शन तर्कों को एक सरणी के रूप में प्राप्त करता है। हम कैश कुंजी उत्पन्न करने के लिए तर्कों का उपयोग करते हैं और जांचते हैं कि परिणाम पहले से ही कैश में है या नहीं। यदि ऐसा है, तो हम कैश्ड परिणाम लौटाते हैं। अन्यथा, हम परिणाम की गणना करते हैं और इसे कैश में संग्रहीत करते हैं।


अंत में, हम विभिन्न तर्कों का उपयोग करके proxy फ़ंक्शन का आह्वान करते हैं और देखते हैं कि परिणाम समान तर्कों के साथ आने वाली कॉल के लिए कैश में संग्रहीत होता है।

मान्यकरण

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

 const user = { name: 'John', password: 'secret', }; const proxy = new Proxy(user, { set(target, prop, value) { if (prop === 'password' && value.length < 8) { throw new Error('Password must be at least 8 characters long'); } target[prop] = value; return true; }, }); console.log(proxy.name); // John console.log(proxy.password); // secret proxy.password = '12345678'; console.log(proxy.password); // 12345678 proxy.password = '123'; // Error


इस उदाहरण में, हम user नामक एक वस्तु को एक name और एक password संपत्ति के साथ परिभाषित करते हैं। हम तब proxy नामक एक प्रॉक्सी ऑब्जेक्ट बनाते हैं जो set ट्रैप का उपयोग करके संपत्ति असाइनमेंट को इंटरसेप्ट करता है। जब भी कोई संपत्ति असाइन की जाती है, तो set ट्रैप को कॉल किया जाता है, और यह संपत्ति का नाम, नया मान और लक्ष्य वस्तु प्राप्त करता है।


हम set ट्रैप का उपयोग यह जांचने के लिए करते हैं कि क्या निर्दिष्ट की जा रही संपत्ति password संपत्ति है और यदि मान 8 वर्णों से कम लंबा है। यदि यह है, तो हम एक त्रुटि फेंक देते हैं। अन्यथा, हम गुण मान को लक्ष्य वस्तु पर सेट करते हैं।


हम password प्रॉपर्टी के लिए विभिन्न मान निर्दिष्ट करने के लिए proxy ऑब्जेक्ट का उपयोग करते हैं और ध्यान दें कि लंबाई में 8 वर्णों से कम का कोई भी मान त्रुटि को ट्रिगर करता है।

लॉगिंग

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

 const user = { name: 'John', email: '[email protected]', }; const proxy = new Proxy(user, { get(target, prop) { console.log(`Getting ${prop} property`); return target[prop]; }, set(target, prop, value) { console.log(`Setting ${prop} property to ${value}`); target[prop] = value; return true; }, }); console.log(proxy.name); // Getting name property -> John proxy.email = '[email protected]'; // Setting email property to [email protected] console.log(proxy.email); // Getting email property -> [email protected]

इस उदाहरण में, हम user नामक एक वस्तु को एक name और एक email संपत्ति के साथ परिभाषित करते हैं। फिर हम proxy नामक एक प्रॉक्सी ऑब्जेक्ट बनाते हैं जो get और set ट्रैप का उपयोग करके प्रॉपर्टी एक्सेस और असाइनमेंट को इंटरसेप्ट करता है।


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


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


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

प्रॉक्सी के लाभ और सीमाएं

प्रॉक्सी के लाभ

  1. अनुकूलन योग्य व्यवहार : प्रॉक्सी ऑब्जेक्ट्स के साथ, आप अन्य ऑब्जेक्ट्स पर बुनियादी संचालन को इंटरसेप्ट और कस्टमाइज़ कर सकते हैं, जिससे आप एक्सेस कंट्रोल, कैशिंग और लॉगिंग जैसी उन्नत सुविधाएँ बना सकते हैं।


  2. इनहेरिटेंस : प्रॉक्सी ऑब्जेक्ट जावास्क्रिप्ट में इनहेरिटेंस पैटर्न को लागू करने की क्षमता प्रदान करते हैं, जिससे अधिक बहुमुखी और स्केलेबल कोड हो सकता है।


  3. प्रतिसंहरणीय : प्रॉक्सी वस्तुओं को उनके बनाए जाने के बाद अक्षम या निरस्त किया जा सकता है, जो उन्हें प्रॉक्सी वस्तु के दायरे को सीमित करने या सुरक्षा कारणों से उपयोगी बनाता है।


प्रॉक्सी की सीमाएं

  1. इस तथ्य के बावजूद कि प्रॉक्सी लंबे समय से हमारे साथ है, ब्राउज़र के सभी संस्करण इस कार्यक्षमता का समर्थन नहीं कर सकते हैं।


  2. इसके अलावा, प्रॉक्सी का उपयोग आपके एप्लिकेशन के प्रदर्शन को नकारात्मक रूप से प्रभावित कर सकता है, खासकर यदि आप उन्हें बहुत बार उपयोग करते हैं।


  3. प्रॉक्सी का उपयोग करने का अर्थ समझना महत्वपूर्ण है। एप्लिकेशन-महत्वपूर्ण क्षणों के लिए इस पर भरोसा नहीं किया जाना चाहिए, जैसे कि उपयोगकर्ता इनपुट का महत्वपूर्ण सत्यापन।

प्रॉक्सी का उपयोग करने के लिए सर्वोत्तम अभ्यास

प्रतिबंधों से अवगत रहें : अपने कोड में प्रॉक्सी लागू करने से पहले, इसके द्वारा लगाए गए प्रतिबंधों से अवगत रहें और वे आपके एप्लिकेशन की गति और सुरक्षा को कैसे प्रभावित कर सकते हैं।

प्रॉक्सी वस्तुओं का उपयोग केवल तभी किया जाना चाहिए जब बिल्कुल जरूरी हो क्योंकि वे आपके कोड के प्रदर्शन को प्रभावित कर सकते हैं।


सावधानी से परीक्षण करें : प्रॉक्सी ऑब्जेक्ट का उपयोग करते समय, सावधानीपूर्वक परीक्षण करना सुनिश्चित करें और किसी भी संभावित अप्रत्याशित व्यवहार के प्रति सतर्क रहें।


मानदंडों का पालन करें : अपने कोड को पढ़ने और बनाए रखने के लिए सरल बनाने के लिए, प्रॉक्सी वस्तुओं को लागू करते समय स्वीकृत सम्मेलनों और सर्वोत्तम प्रथाओं का पालन करें।

निष्कर्ष

यह आलेख प्रॉक्सी की उन्नत सुविधाओं, जैसे वंशानुक्रम पैटर्न और प्रतिसंहरणीय प्रॉक्सी ऑब्जेक्ट बनाने की क्षमता के बारे में बताता है।


एक डेवलपर के रूप में आपके अनुभव के स्तर के बावजूद, जावास्क्रिप्ट में प्रॉक्सी को समझना आपके कोड को उच्च स्तर तक ले जाने के लिए मौलिक है।


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