जावास्क्रिप्ट में गेटर्स और सेटर्स के लिए अंतिम गाइड
getters तथा setters उपयोग किए जाने वाले कार्य या विधियां हैं प्राप्त तथा सेट चरों का मान. गेटटर-सेटर की अवधारणा है कंप्यूटर प्रोग्रामिंग में आम है: लगभग सभी उच्च-स्तरीय प्रोग्रामिंग भाषाएं गेटसिप्ट सहित गेटर्स और सेटर को लागू करने के लिए सिंटैक्स के सेट के साथ आती हैं.
इस पोस्ट में, हम देखेंगे कि गेटर्स बसने वाले और किस तरह के हैं उन्हें जावास्क्रिप्ट में बनाएँ और उनका उपयोग करें.
गेट-सेटर्स और इनकैप्सुलेशन
गेटर्स और सेटर का विचार हमेशा उल्लेख किया जाता है इनकैप्सुलेशन के साथ संयोजन के रूप में. एनकैप्सुलेशन हो सकता है दो तरह से समझा.
सबसे पहले, यह की स्थापना है डेटा ही टिककर खेल setters के उस डेटा तक पहुँचने और संशोधित करने के लिए तिकड़ी। यह परिभाषा तब उपयोगी होती है जब कुछ संचालन, जैसे कि सत्यापन, होना चाहिए डेटा पर प्रदर्शन किया इसे बचाने या देखने से पहले गेटर्स और सेटर इसके लिए सही घर प्रदान करते हैं.
दूसरे, एक सख्त परिभाषा है जिसके अनुसार एनकैप्सुलेशन किया जाता है डेटा छिपाएँ, अन्य कोड से इसे दुर्गम बनाने के लिए, सिवाय गेटर्स और सेटर के. इस तरह हम खत्म नहीं होते गलती से महत्वपूर्ण डेटा ओवरराइटिंग कार्यक्रम में कुछ अन्य कोड के साथ.
गेटर्स और सेटर बनाएं
1. तरीकों के साथ
चूंकि गेटर्स और सेटर हैं मूल रूप से कार्य करता है उस मूल्य को प्राप्त करने / बदलने के लिए एक से अधिक तरीके उन्हें बनाने और उपयोग करने के लिए। पहला तरीका है:
var obj = foo: 'यह फू का मान है', getFoo: function () रिटर्न this.foo; , setFoo: function (val) this.foo = val; कंसोल.लॉग (obj.getFoo ()); // "यह फू का मान है" obj.setFoo ('हैलो'); console.log (obj.getFoo ()); // "नमस्ते"
ये है सबसे सरल तरीका है गेटर्स और सेटर बनाने के लिए। एक संपत्ति है foo
और दो विधियाँ हैं: getFoo
तथा setFoo
सेवा मेरे वापस लौटें और एक मान निर्दिष्ट करें उस संपत्ति को.
2. कीवर्ड के साथ
एक और “आधिकारिक” और गेटर्स और सेटर बनाने का मजबूत तरीका है प्राप्त
तथा सेट
कीवर्ड.
सेवा मेरे भगदड़ मचाना, इसे रखो प्राप्त
कीवर्ड एक फ़ंक्शन घोषणा के सामने जो कि गेटर विधि के रूप में काम करेगा, और इसका उपयोग करेगा सेट
कीवर्ड उसी तरह से एक सेटर बनाएँ. सिंटैक्स निम्नानुसार है:
var obj = fooVal: 'यह फू का मान है', foo मिलता है () this.fooVal; , फू सेट (वैल) this.fooVal = val; कंसोल.लॉग (obj.foo); // "यह फू का मान है" obj.foo = 'हैलो'; console.log (obj.foo); // "नमस्ते"
ध्यान दें कि डेटा केवल हो सकता है एक संपत्ति नाम के तहत संग्रहीत (fooVal
) वह है विभिन्न गेट्टर-सेटर विधियों के नाम से (foo
) क्योंकि गेटटर-सेटर की संपत्ति है डेटा को पकड़ नहीं सकता भी.
कौन सा तरीका बेहतर है?
यदि आप कीवर्ड के साथ गेटर्स और सेटर बनाना चुनते हैं, तो आप इसका उपयोग कर सकते हैं असाइनमेंट ऑपरेटर डेटा सेट करने के लिए और यह डेटा प्राप्त करने के लिए डॉट ऑपरेटर, इसी तरह से आप एक नियमित संपत्ति के मूल्य को एक्सेस / सेट करेंगे.
हालांकि, यदि आप गेटर्स और सेटरिंग कोडिंग का पहला तरीका चुनते हैं, तो आपको सेटर और गेट्टर विधियों को कॉल करना होगा फ़ंक्शन कॉल सिंटैक्स का उपयोग करना क्योंकि वे विशिष्ट कार्य कर रहे हैं (विशेष उन का उपयोग करके बनाया गया कुछ भी नहीं है प्राप्त
तथा सेट
कीवर्ड्स).
इसके अलावा, एक मौका है कि आप गलती से समाप्त हो सकते हैं कुछ अन्य मूल्य प्रदान करना उन संपत्तियों को जो उन गटर-सेटर विधियों को आयोजित करते हैं और उन्हें पूरी तरह से खो दें! कुछ आपको बाद की विधि में चिंता करने की ज़रूरत नहीं है.
तो, आप देख सकते हैं कि मैंने क्यों कहा दूसरी तकनीक अधिक मजबूत है.
ओवरराइटिंग की रोकथाम
यदि किसी कारण से आप पहली तकनीक पसंद करते हैं, तो गेट्टर-सेटर विधियों को धारण करने वाले गुणों को बनाएं सिफ़ पढ़िये उन्हें बनाकर का उपयोग करते हुए Object.defineProperties
. के माध्यम से बनाए गए गुण Object.defineProperties
, Object.defineProperty
तथा Reflect.defineProperty
स्वचालित रूप से कॉन्फ़िगर करें सेवा मेरे पहलवान: झूठा
जिसका मतलब है सिफ़ पढ़िये:
/ * ओवरराइट रोकथाम * / var obj = foo: 'यह फू का मूल्य है'; Object.defineProperties (obj, 'getFoo': value: function () return..foo;, 'setFoo': value: function (val) this.foo = val;); obj.getFoo = 66; // getFoo को अधिलेखित नहीं किया जा रहा है! console.log (obj.getFoo ()); // "यह फू का मूल्य है"
गेटर्स और सेटर के अंदर संचालन
एक बार जब आप गेटर्स और सेटर शुरू कर देते हैं, तो आप आगे बढ़ सकते हैं और डेटा पर कार्रवाई करते हैं इसे बदलने या वापस करने से पहले.
नीचे दिए गए कोड में, गेट्टर फ़ंक्शन में डेटा है एक स्ट्रिंग के साथ समाप्त लौटाए जाने से पहले, और सेटर में एक सत्यापन कार्य करता है मान एक संख्या है या नहीं अद्यतन करने से पहले किया जाता है n
.
var obj = n: 67, id प्राप्त करें () वापसी 'आईडी है:' + this.n; , सेट आईडी (वैल) अगर (टाइपो वैल === 'नंबर') यह.न = वैल; कंसोल.लॉग (obj.id); // "आईडी है: 67" obj.id = 893; console.log (obj.id); // "आईडी है: 893" obj.id = 'हैलो'; console.log (obj.id); // "आईडी है: 893"
डेटा को गेटर्स और सेटर्स से सुरक्षित रखें
अब तक, हमने एनकैप्सुलेशन के पहले संदर्भ में गेटर्स और सेटर्स के उपयोग को कवर किया। चलो दूसरे पर चलते हैं, अर्थात कैसे करें बाहरी कोड से डेटा छिपाएँ गेटर्स और सेटरों की मदद से.
असुरक्षित डेटा
गेटर्स और सेटर्स की स्थापना का मतलब यह नहीं है कि डेटा को केवल उन तरीकों से एक्सेस और बदला जा सकता है। निम्नलिखित उदाहरण में, यह है सीधे बदल गया बिना गेट्टर और सेटर के तरीकों को छुए:
var obj = fooVal: 'यह foo का मान है', foo () this.fooVal; , फू सेट (वैल) this.fooVal = val; obj.fooVal = 'हैलो'; console.log (obj.foo); // "नमस्ते"
हमने सेटर का उपयोग नहीं किया लेकिन डेटा को सीधे बदल दिया (fooVal
). डेटा हम शुरू में अंदर सेट करें obj
अब चला गया है! ऐसा होने से रोकने के लिए (गलती से), आप कुछ सुरक्षा की जरूरत है आपके डेटा के लिए। आप इसे जोड़ सकते हैं दायरे को सीमित करना आपका डेटा कहां उपलब्ध है। आप ऐसा कर सकते हैं ब्लॉकिंग या कार्य करना.
1. ब्लॉक स्कूपिंग
एक तरीका है ब्लॉक स्कोप का उपयोग करें जिसके अंदर डेटा का उपयोग करके परिभाषित किया जाएगा चलो
कीवर्ड जो इसके दायरे को सीमित करता है उस ब्लॉक को.
ए ब्लॉक स्कोप अपना कोड रखकर बनाया जा सकता है घुंघराले ब्रेसिज़ की एक जोड़ी के अंदर. जब भी आप एक ब्लॉक स्कोप बनाते हैं तो सुनिश्चित करें एक टिप्पणी छोड़ें ऊपर यह ब्रेसिज़ को अकेला छोड़ देने के लिए कहता है, ताकि कोई भी न हो ब्रेसिज़ निकालता है गलती से वे कोड में कुछ अतिरिक्त अतिरेक ब्रेसिज़ हैं या सोच रहे हैं एक लेबल जोड़ें ब्लॉक दायरे में.
/ * ब्लॉक स्कोप, ब्रेसिज़ को अकेला छोड़ दें! * / जाने fooVal = 'यह फू का मूल्य है'; var obj = get foo () वापसी fooVal; , सेट फू (वैल) fooVal = val fooVal = 'हैलो'; // ब्लॉक कंसोल के अंदर fooVal को प्रभावित नहीं करने जा रहा है ।log (obj.foo); // "यह फू का मूल्य है"
बदल रहा है / बनाने fooVal
ब्लॉक के बाहर प्रभावित नहीं करेगा fooVal
गेटर्स के अंदर भेजा जाता है.
2. फंक्शन स्कूपिंग
स्कोपिंग के साथ डेटा की रक्षा करने का अधिक सामान्य तरीका है किसी फ़ंक्शन के अंदर डेटा रखना तथा कोई वस्तु लौटाना उस फंक्शन से गेटर्स और सेटर्स के साथ.
function myobj () var fooVal = 'यह foo का मान है'; return get foo () रिटर्न fooVal; , सेट फू (वैल) fooVal = val fooVal = 'हैलो'; // हमारे मूल fooVal var obj = myobj () को प्रभावित नहीं करने वाला; console.log (obj.foo); // "यह फू का मूल्य है"
वस्तु (के साथ) foo ()
गेटटर-सेटर इसके अंदर) द्वारा लौटा दिया गया myobj ()
कार्य है में बचाया obj
, और फिर obj
उपयोग किया जाता है गेट्टर और सेटर को कॉल करें.
3. डेटा सुरक्षा बिना स्कूपिंग के
एक और तरीका है जिससे आप अपने डेटा को ओवरराइट होने से बचा सकते हैं इसके दायरे को सीमित किए बिना. इसके पीछे का तर्क इस तरह से है: यदि आप नहीं जानते कि आप क्या कहते हैं, तो आप डेटा का एक टुकड़ा कैसे बदल सकते हैं?
यदि डेटा ए है इतनी आसानी से प्रतिलिपि प्रस्तुत करने योग्य चर / संपत्ति का नाम नहीं, संभावनाएं कोई भी नहीं हैं (यहां तक कि खुद) उस चर / संपत्ति के नाम के लिए कुछ मूल्य बताकर इसे समाप्त करने जा रहा है.
var obj = s89274934764: 'यह फू का मूल्य है', फू प्राप्त करें () इसे वापस करें। s89274934764; , फू (वैल) सेट करें this.s89274934764 = वैल; कंसोल.लॉग (obj.foo); // "यह फू का मूल्य है"
देखें, यह काम करने का एक तरीका है। यद्यपि मैंने जो नाम चुना है वह वास्तव में अच्छा नहीं है, आप भी कर सकते हैं यादृच्छिक मूल्यों या प्रतीकों का उपयोग करें संपत्ति के नाम बनाने के लिए जैसा कि इस ब्लॉग पोस्ट में डेरिक बेली ने प्रस्तावित किया है। मुख्य लक्ष्य है डेटा छिपा कर रखें अन्य कोड से और इसे पाने / अपडेट करने के लिए गेटटर-सेटर जोड़ी दें.
आपको गेटर्स और सेटर का उपयोग कब करना चाहिए?
अब बड़ा सवाल यह है कि क्या आप गेटर्स और सेटर को असाइन करना शुरू करते हैं अपने सभी डेटा के लिए अभी व?
अगर तुम हो डेटा छिपाना, तो वहाँ है कोई अन्य विकल्प नहीं.
लेकिन अगर आपका डेटा अन्य कोड द्वारा देखा जा रहा है तो ठीक है, क्या आपको अभी भी गेटर्स सेटर का उपयोग करने की आवश्यकता है बस इसे कोड के साथ बंडल करने के लिए उस पर कुछ संचालन करता है? मेरे अनुसार हाँ. कोड बहुत जल्द जुड़ जाता है. अपने स्वयं के गेटटर सेटर के साथ व्यक्तिगत डेटा की सूक्ष्म इकाइयाँ बनाना आपको एक निश्चित स्वतंत्रता प्रदान करता है कोड के अन्य भागों को प्रभावित किए बिना उक्त डेटा पर काम करना.