जावास्क्रिप्ट में कक्षाओं की अतिरिक्त विशेषताएँ
इस लेख में, हम जावास्क्रिप्ट में कक्षाओं की अतिरिक्त विशेषताओं को समझाएंगे।
YouTube Video
जावास्क्रिप्ट में कक्षाओं की अतिरिक्त विशेषताएँ
जावास्क्रिप्ट में निजी गुण (प्रॉपर्टीज़)
जावास्क्रिप्ट में, निजी गुण वे गुण होते हैं जो केवल ऑब्जेक्ट या कक्षा के अंदर ही सुलभ होते हैं। यह एन्कैप्सुलेशन प्रदान कर अधिक सुरक्षित और मजबूत कोड डिज़ाइन सक्षम करता है, ताकि बाहरी कोड द्वारा सीधे संशोधन या संदर्भ संभव न हो।
ECMAScript 2020 (ES11) में 2020 में, क्लास के भीतर निजी फ़ील्ड को परिभाषित करने के लिए #
(हैश) के उपयोग को प्रस्तुत किया गया। यह पारंपरिक जावास्क्रिप्ट निजी परंपराओं (जैसे अंडरस्कोर से शुरू होने वाले वेरिएबल नाम) की जगह एक स्पष्ट तरीका प्रदान करता है।
निजी गुणों के लाभ
निम्नलिखित निजी गुणों के लाभ हैं।
- कैप्सुलेशन (Encapsulation): आंतरिक स्थिति को बाहरी दुनिया से छुपाता है और डेटा की संगति बनाए रखता है।
- सुरक्षा: बाहरी कोड द्वारा अनजाने में गुणों को संशोधित किए जाने से रोकता है।
- बेहतर रखरखाव: वस्तुओं या कक्षाओं (classes) के कार्यान्वयन को छुपाता है और बाहरी रूप से उजागर इंटरफ़ेस को स्पष्ट करता है।
निजी गुणों का उपयोग कैसे करें
कक्षाओं में निजी गुणों को परिभाषित करना
निजी फ़ील्ड्स को #
से शुरू होने वाले नाम का उपयोग करके परिभाषित किया जाता है। इस फ़ील्ड को क्लास या इसकी सबकक्षाओं के इंस्टेंस से सीधे एक्सेस नहीं किया जा सकता।
1class Person {
2 // Define private property
3 #name;
4
5 constructor(name) {
6 this.#name = name;
7 }
8
9 // Method to access the private property
10 getName() {
11 return this.#name;
12 }
13
14 // Method to change the private property
15 setName(newName) {
16 this.#name = newName;
17 }
18}
19
20const john = new Person("John");
21console.log(john.getName()); // John
22
23// Cannot access private property directly
24console.log(john.#name); // SyntaxError: Private field '#name' must be declared in an enclosing class
ऊपर के कोड में, #name
एक निजी गुण है जिसे Person
क्लास के बाहर से सीधे एक्सेस नहीं किया जा सकता। आप केवल getName
और setName
विधियों के माध्यम से नाम को एक्सेस या बदल सकते हैं।
निजी मेथड्स को परिभाषित करना
निजी गुणों की तरह, निजी विधियों को भी #
से शुरू होने वाले नाम का उपयोग करके परिभाषित किया जाता है। निजी विधियों को केवल कक्षा के भीतर से ही बुलाया जा सकता है।
1class Counter {
2 #count = 0;
3
4 increment() {
5 this.#count++;
6 this.#logCount(); // Calling private method
7 }
8
9 // Private method
10 #logCount() {
11 console.log(`Current count: ${this.#count}`);
12 }
13}
14
15const counter = new Counter();
16counter.increment(); // Current count: 1
17
18// Cannot access private method directly
19counter.#logCount(); // SyntaxError: Private field '#logCount' must be declared in an enclosing class
यहां, #logCount
एक निजी विधि के रूप में परिभाषित है और इसे कक्षा के बाहर से एक्सेस नहीं किया जा सकता। यह विधि केवल कक्षा के भीतर उपयोग की जाती है।
निजी गुणों के लाभ और विचार
लाभ
- क्योंकि इसे क्लास के बाहर से सीधे एक्सेस नहीं किया जा सकता है, गैर-इरादतन बदलाव या ऑपरेशन रोके जा सकते हैं।
- क्योंकि बाहरी दृष्टि से अदृश्य भागों को अच्छे से छुपाया जा सकता है, आप उन भागों को स्पष्ट रूप से प्रबंधित कर सकते हैं जिन्हें आप API के रूप में प्रकट करते हैं।
नोट्स
- क्योंकि निजी फील्ड क्लास के बाहर से पूरी तरह छुपाए हुए होते हैं, परीक्षण और डिबगिंग कठिन हो सकता है। इसलिए, यह महत्वपूर्ण है कि डिज़ाइन चरण में पूरी तरह से परीक्षण की जाने योग्य API प्रदान की जाए।
- निजी फील्ड प्रोटोटाइप-आधारित विशेषताओं वाली अन्य JavaScript पहचानों से भिन्न व्यवहार करते हैं क्योंकि वे प्रत्येक इंस्टेंस के लिए अद्वितीय होते हैं।
निजी गुणों का पारंपरिक उपनाम आधारित कार्यान्वयन
निजी फील्ड के लिए #
का उपयोग पेश किए जाने से पहले, JavaScript में निजी गुणों के लिए कोई आधिकारिक सिंटैक्स नहीं था। इसलिए, अतीत में, छद्म-निजी गुणों को निम्नलिखित तरीकों से कार्यान्वित किया गया था।
अंडरस्कोर के उपयोग का प्रचलन
डेवलपर्स पारंपरिक रूप से चर नामों से पहले अंडरस्कोर जोड़कर 'निजी' का संकेत देते थे।
1class Car {
2 constructor(brand) {
3 this._brand = brand; // Using an underscore to indicate private
4 }
5
6 getBrand() {
7 return this._brand;
8 }
9}
10
11const car = new Car("Toyota");
12console.log(car.getBrand()); // Toyota
13console.log(car._brand); // Toyota (Accessible from outside)
यह तरीका केवल एक 'परंपरा' है, और व्यवहार में, गुणों को फिर भी बाहरी रूप से एक्सेस किया जा सकता है।
क्लोजर का उपयोग करके निजी गुणों का कार्यान्वयन
फंक्शन स्कोप के साथ क्लोजर का उपयोग करके भी निजी गुणों को हासिल किया जा सकता है।
1function createPerson(name) {
2 let _name = name; // Private variable within function scope
3
4 return {
5 getName: function() {
6 return _name;
7 },
8 setName: function(newName) {
9 _name = newName;
10 }
11 };
12}
13
14const person = createPerson("Alice");
15console.log(person.getName()); // Alice
16person.setName("Bob");
17console.log(person.getName()); // Bob
18
19// Cannot access directly from outside
20console.log(person._name); // undefined
इस विधि में, चर _name
फंक्शन स्कोप के भीतर संलग्न होता है और इसे सीधे बाहरी रूप से एक्सेस नहीं किया जा सकता।
सारांश
JavaScript में निजी गुण क्लास और ऑब्जेक्ट डिज़ाइन में एनकैप्सुलेशन प्रदान करने में बहुत प्रभावी हैं, जो डेटा को सुरक्षित रूप से संरक्षित करने में मदद करते हैं। ES2020 में पेश किए गए निजी फील्ड के लिए #
नोटेशन पारंपरिक परंपराओं और क्लोजर की तुलना में गोपनीयता प्रबंधन का एक स्पष्ट और अधिक सुरक्षित तरीका प्रदान करता है।
JavaScript में विकल्प श्रंखला (Optional Chaining)
विकल्प श्रंखला JavaScript में गहराई से नेस्ट किए गए ऑब्जेक्ट्स के गुणों को एक्सेस करने के लिए एक बहुत उपयोगी सिंटैक्स है। यह विशेष गुणों की उपस्थिति को व्यक्तिगत रूप से जांचे बिना सुरक्षित एक्सेस की अनुमति देकर कोड की पठनीयता और रखरखाव को बढ़ाता है।
विकल्प श्रंखला का मूल सिंटैक्स
विकल्प श्रंखला का उपयोग ?
को डॉट (.
) या ब्रैकेट नोटेशन से पहले रखकर किया जा सकता है, जो गुण एक्सेस के लिए उपयोग किए जाते हैं। यह नोटेशन तब undefined
लौटाता है जब एक यात्रा किए गए गुण की वैल्यू null
या undefined
होती है, जिससे प्रोग्राम को बिना किसी त्रुटि के सुरक्षित रूप से चलने की अनुमति मिलती है।
उदाहरण:
1const user = {
2 name: 'John',
3 address: {
4 street: '123 Main St',
5 city: 'New York'
6 }
7};
8
9// Without using optional chaining
10const city = user && user.address && user.address.city;
11console.log(city); // New York
12
13// Using optional chaining
14const cityWithOptionalChaining = user?.address?.city;
15console.log(cityWithOptionalChaining); // New York
इस उदाहरण में, हम user
ऑब्जेक्ट के address
और उसके city
गुण को एक्सेस कर रहे हैं। वैकल्पिक चेनिंग का उपयोग किए बिना, आपको कई अस्तित्व जांचें करनी पड़ेंगी, लेकिन वैकल्पिक चेनिंग के साथ, आप एक ही वक्तव्य के साथ संपत्ति को सुरक्षित रूप से एक्सेस कर सकते हैं।
ऐरे और फंक्शन के साथ वैकल्पिक चेनिंग का उपयोग
वैकल्पिक चेनिंग केवल ऑब्जेक्ट गुणों तक ही सीमित नहीं है, इसे ऐरे तत्वों और फंक्शन कॉल पर भी लागू किया जा सकता है।
ऐरे के साथ उदाहरण:
1const users = [{ name: 'Alice' }, { name: 'Bob' }];
2
3// Accessing the non-existent third element
4const thirdUser = users[2]?.name;
5console.log(thirdUser); // undefined
फंक्शन के साथ उदाहरण:
1const user = {
2 greet: function() {
3 return 'Hello!';
4 }
5};
6
7// Call the function only if greet exists
8const greeting = user.greet?.();
9console.log(greeting); // Hello!
10
11// Return undefined if greet does not exist
12const nonExistentGreeting = user.nonExistentMethod?.();
13console.log(nonExistentGreeting); // undefined
डिफ़ॉल्ट मानों के साथ वैकल्पिक चेनिंग का संयोजन
वैकल्पिक चेनिंग का उपयोग करते समय, यह सामान्य है कि यदि कोई गुण मौजूद नहीं है, तो डिफ़ॉल्ट मान निर्दिष्ट करने के लिए लॉजिकल OR (||
) या नलिश कोएलसिंग ऑपरेटर (??
) का उपयोग किया जाता है।
उदाहरण:
1const user = {
2 name: 'John',
3 address: {
4 city: 'New York'
5 }
6};
7
8// Set a default value for a non-existent property
9const state = user?.address?.state || 'Unknown';
10console.log(state); // Unknown
11
12// Example using the nullish coalescing operator
13const zipCode = user?.address?.zipCode ?? '00000';
14console.log(zipCode); // 00000
||
ऑपरेटर false
, 0
, ''
, आदि को फाल्सी मानता है, जबकि ??
ऑपरेटर केवल तभी डिफ़ॉल्ट मान का उपयोग करता है जब ओपेरैंड null
या undefined
हो।
वैकल्पिक चेनिंग के लाभ
- नेस्टेड ऑब्जेक्ट्स तक सुरक्षित पहुंच: वैकल्पिक चेनिंग का उपयोग करके, आपको स्पष्ट अस्तित्व जांच करने की आवश्यकता नहीं होती, जिससे कोड अधिक संक्षिप्त हो जाता है।
- त्रुटियों से बचाव: यह रनटाइम त्रुटियों को रोक सकता है भले ही कोई गुण
null
याundefined
हो। - रीडेबिलिटी और मेंटेनबिलिटी में सुधार: विशेष रूप से जब बहुत सारे नेस्टेड ऑब्जेक्ट्स के साथ काम किया जाता है, कोड की पठनीयता में बहुत सुधार होता है।
वैकल्पिक चेनिंग के साथ सावधानियां
- वैकल्पिक चेनिंग का बार-बार उपयोग इस बात का संकेत हो सकता है कि डेटा संरचना का डिज़ाइन अत्यधिक जटिल है। आपको एक सरल डेटा मॉडल की कोशिश करनी चाहिए।
- चूंकि कुछ पुराने ब्राउज़र्स और जावास्क्रिप्ट इंजन इसे समर्थन नहीं देते हैं, आपको पॉलीफिल्स या ट्रांसपाइलर्स का उपयोग करने की आवश्यकता हो सकती है।
निष्कर्ष
वैकल्पिक चेनिंग एक शक्तिशाली विशेषता है जो जावास्क्रिप्ट में नेस्टेड ऑब्जेक्ट्स के गुणों और फंक्शनों तक सुरक्षित पहुंच को सरल बनाती है। यह विशेष रूप से गहराई से नेस्टेड डेटा संरचनाओं तक पहुंचने पर प्रभावी है, जिससे त्रुटि निवारण और कोड रीडेबिलिटी में सुधार होता है।
आप हमारे YouTube चैनल पर Visual Studio Code का उपयोग करके ऊपर दिए गए लेख के साथ आगे बढ़ सकते हैं। कृपया YouTube चैनल को भी देखें।