जावास्क्रिप्ट में संपत्ति और विधि के नाम के लिए अंडरस्कोर उपसर्ग


241

क्या जावास्क्रिप्ट में अंडरस्कोर उपसर्ग केवल एक सम्मेलन है, उदाहरण के लिए पायथन निजी वर्ग के तरीके हैं?

2.7 पायथन प्रलेखन से:

"निजी" उदाहरण चर, जिसे किसी वस्तु के अंदर से छोड़कर नहीं पहुँचा जा सकता है, पायथन में मौजूद नहीं है। हालाँकि, एक सम्मेलन है जो अधिकांश पायथन कोड के बाद होता है: एक अंडरस्कोर (जैसे _spam) के साथ उपसर्गित नाम को एपीआई के गैर-सार्वजनिक हिस्से के रूप में माना जाना चाहिए (चाहे वह एक फ़ंक्शन, एक विधि या डेटा सदस्य हो) ।

क्या यह जावास्क्रिप्ट पर भी लागू होता है?

उदाहरण के लिए यह जावास्क्रिप्ट कोड लें:

function AltTabPopup() {
    this._init();
}

AltTabPopup.prototype = {
    _init : function() {
        ...
    }
}

इसके अलावा, अंडरस्कोर उपसर्ग चर का उपयोग किया जाता है।

    ...
    this._currentApp = 0;
    this._currentWindow = -1;
    this._thumbnailTimeoutId = 0;
    this._motionTimeoutId = 0;
    ...

केवल सम्मेलन? या अंडरस्कोर उपसर्ग के पीछे अधिक है?


मैं स्वीकार करता हूं कि मेरा प्रश्न इस प्रश्न से काफी मिलता-जुलता है , लेकिन इसने जावा में अंडरस्कोर उपसर्ग के महत्व के बारे में एक भी समझदारी नहीं दिखाई।


जवाबों:


33

2019 में आपका स्वागत है!

यह उपसर्ग चर को निजी स्वीकार करने की अनुमति देने के लिए वर्ग सिंटैक्स का विस्तार करने का एक प्रस्ताव प्रतीत होता है #। इस समर्थन के साथ क्रोम 74 जहाज

_ उपसर्ग चर नामों को सम्मेलन द्वारा निजी माना जाता है लेकिन अभी भी सार्वजनिक हैं।

यह सिंटैक्स दोनों के बीच सहज और सहज होने की कोशिश करता है, हालांकि यह अन्य प्रोग्रामिंग भाषाओं से अलग है।

सभी यूनिकोड कोड बिंदुओं में से # सर्जन को क्यों चुना गया?

  • @ प्रारंभिक पसंदीदा था, लेकिन इसे सज्जाकारों द्वारा लिया गया था। TC39 ने डेकोरेटिंग डेकोरेटर्स और प्राइवेट स्टेट सिगल्स पर विचार किया, लेकिन कमेटी ने ट्रांसपॉयलर यूजर्स के मौजूदा इस्तेमाल को टालने का फैसला किया।
  • _ मौजूदा जावास्क्रिप्ट कोड के साथ संगतता समस्याओं का कारण होगा, जिसने पहचानकर्ता या (सार्वजनिक) संपत्ति के नाम की शुरुआत में लंबे समय तक अनुमति दी है।

यह प्रस्ताव जुलाई 2017 में स्टेज 3 पर पहुंच गया। उस समय से, विभिन्न विकल्पों के बारे में व्यापक विचार और लंबी चर्चा हुई है। अंत में, इस विचार प्रक्रिया और निरंतर सामुदायिक जुड़ाव के कारण इस भंडार में प्रस्ताव पर नए सिरे से सहमति बनी। उस सहमति के आधार पर, कार्यान्वयन इस प्रस्ताव पर आगे बढ़ रहे हैं।

Https://caniuse.com/#feat=mdn-javascript_classes_pStreet_class_fields देखें


257

वह केवल एक सम्मेलन है। जावास्क्रिप्ट भाषा अंडरस्कोर वर्णों से शुरू होने वाले पहचानकर्ताओं को कोई विशेष अर्थ नहीं देती है।

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


4
हाँ। यहां तक ​​कि अगर भाषा इसे "समर्थन" नहीं करती है, तो यह एक बहुत ही आसान सम्मेलन है।
जुहो वेपसैलीन

गंभीर संभावना। jsfiddle.net/VmFSR जैसा कि आप वहां देख सकते हैं, बनाया गया नाम केवल नए मूल्य को उपसर्ग करने से सुलभ है, बनाया गया है, _मैं यह जानने के लिए प्यार करता हूँ कि क्या चल रहा है !? this.nameइसके बजाय क्यों नहीं है ?
मुहम्मद उमर

1
@ मुहम्मद उमर, मुझे यकीन नहीं है कि मैं आपकी टिप्पणी को समझ सकता हूं। console.log(someone._name = "Jean Dupont");साथ ही साथ काम करता है console.log(someone.name);, और यह संपत्ति के पीछे अंडरस्कोर-उपसर्ग सदस्य को असाइन और मूल्यांकन करता है। जैसा कि आप देख सकते हैं , theres बिना गारंटी के एनकैप्सुलेशन के माध्यम से है :)
Frédéric Hamidi

3
डिफ़ॉल्ट रूप से, Visual Studio आपको इसका सम्मान करने में मदद करने का प्रयास करता है। जावास्क्रिप्ट IntelliSense इंजन आपको "निजी" गुण दिखाता है, ऑब्जेक्ट के अंदर से, "यह" चर का उपयोग करते समय। लेकिन, जब इसे बाहर से बुलाया जाता है, तो यह सभी रेखांकित विशेषताओं को छुपाता है।
foxontherock

1
@ कुरुंगा उन्होंने 2010 में इस बात का जवाब दिया - बेशक 10 साल में चीजें बदल गई हैं
केनी मेयर

99

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


19
क्लोजर प्राप्त करने के तरीके को स्पष्ट करने के लिए वोट करें, अंडरस्कोर कहने के लिए डाउन वोट अच्छा सम्मेलन है। इसलिए मैं किसी भी तरह से वोट नहीं दूंगा :)
जेसन

3
सदस्यों को बंद करने में छिपाना कभी-कभी परीक्षा में बाधा बन सकता है। : इस लेख को देखें adequatelygood.com/2010/7/Writing-Testable-JavaScript
ज़ैक Lysobey

4
@ जेसन - बस जिज्ञासु, आप अंडरस्कोर को एक बुरा सम्मेलन क्यों मानते हैं?
तमसे पापा

5
@ टामसैप - कुछ कारण, लेकिन सिर्फ मेरा विकल्प: 1) जेएस को अन्य भाषाओं की शैली में मजबूर करने के लिए एक बैसाखी 2) यदि यह सुलभ है, तो इसका उपयोग किया जाएगा। अंडरस्कोर ऊपर कोड के बाहर और दृढ़ कर सकते हैं। 3) नए जेएस प्रोग्रामर को भ्रमित करना।
जेसन

9
यहां तक ​​कि एक बंद होने के साथ, तथाकथित "निजी" चर तक पहुंच प्राप्त करना तकनीकी रूप से संभव है। _संक्रमण कम से कम देवों को अपने जोखिम (या ऐसा कुछ) पर ऐसा करने की अनुमति देता है।
सिंक करें

14

JSDoc 3 आपको अपने कार्यों को एनोटेट करने की अनुमति देता है @access private(पहले @privateटैग) जो अन्य डेवलपर्स के लिए आपके इरादे को प्रसारित करने के लिए भी उपयोगी है - http://usejsdoc.org/tags-access.html


10

"केवल कन्वेंशन? या अंडरस्कोर उपसर्ग के पीछे अधिक है?"

गोपनीयता सम्मेलनों के अलावा, मैं यह भी जागरूकता लाने में मदद करना चाहता था कि अंडरस्कोर उपसर्ग का उपयोग उन तर्कों के लिए भी किया जाता है जो स्वतंत्र तर्कों पर निर्भर होते हैं, विशेष रूप से यूआरआई लंगर मानचित्रों में। आश्रित चाबियाँ हमेशा एक नक्शे की ओर इशारा करती हैं।

उदाहरण ( https://github.com/mmikowski/urianchor से ):

$.uriAnchor.setAnchor({
  page   : 'profile',
  _page  : {
    uname   : 'wendy',
    online  : 'today'
  }
});

ब्राउज़र खोज क्षेत्र पर URI लंगर को बदल दिया गया है:

\#!page=profile:uname,wendy|online,today

यह एक कन्वेंशन है जिसका उपयोग हैश परिवर्तन के आधार पर एप्लिकेशन स्टेट को चलाने के लिए किया जाता है।


8

import/exportअब ES6 के साथ काम कर रहा है। _यदि मेरा अधिकांश कार्य निर्यात हो जाता है, तो भी मैं निर्यातित कार्यों को नहीं करता हूँ।

यदि आप केवल एक वर्ग (कोणीय परियोजनाओं की तरह) निर्यात करते हैं, तो इसकी बिल्कुल आवश्यकता नहीं है।

export class MyOpenClass{

    open(){
         doStuff()
         this._privateStuff()
         return close();
    }

    _privateStuff() { /* _ only as a convention */} 

}

function close(){ /*... this is really private... */ }

मुझे नहीं लगता कि आयात / निर्यात किसी भी तरह से निजी वर्ग के तरीकों के लिए समर्थन प्रदान करता है। मेरा मतलब है, यह वर्ग स्तर पर एक समान कार्यक्षमता का समर्थन करता है, लेकिन यह निहित तरीकों को छिपाने की पेशकश नहीं करता है। (यानी सभी निहित विधियां हमेशा सार्वजनिक होती हैं)
bvdb

आप वर्ग निर्यात करते हैं, और आंतरिक फ़ंक्शन कॉल बाहर फ़ंक्शन करते हैं। ये कार्य निजी हैं।
निकोलस ज़ोज़ोल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.