जावास्क्रिप्ट में, इस अंडरस्कोर का क्या मतलब है?


85
var Gallery = Backbone.Controller.extend({
    _index: null,
    _photos: null,
    _album :null,
    _subalbums:null,
    _subphotos:null,
    _data:null,
    _photosview:null,
    _currentsub:null,
    routes: {
        "": "index",
        "subalbum/:id": "subindex",
        "subalbum/:id/" : "directphoto",
        "subalbum/:id/:num" : "hashphoto"
    },
    initialize: function(options) {
        var ws = this;
        if (this._index === null){
            $.ajax({
                url: 'data/album1.json',
                dataType: 'json',
                data: {},
                success: function(data) {
                    ws._data = data;
                    ws._photos =
                    new PhotoCollection(data);
                    ws._index =
                    new IndexView({model: ws._photos});
                    Backbone.history.loadUrl();
                }
            });
            return this;
        }
        return this;
    },
    //Handle rendering the initial view for the
    //application
    index: function() {
        this._index.render();
    },

मैं यहाँ backbone.js पर एक ट्यूटोरियल पढ़ रहा हूँ: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

अंडरस्कोर क्या हैं? (_index, _photos, _album) उनका उपयोग क्यों करें?


2
अंडरस्कोर का कोई वाक्यात्मक अर्थ नहीं है, यह संभवतः उस विशेष प्रोग्रामर के लिए एक सम्मेलन है जो चर के प्रकार को दर्शाता है
नैट कोपेनहेवर

जवाबों:


164

इसका मतलब है निजी क्षेत्र या निजी तरीके। वे विधियाँ जो केवल आंतरिक उपयोग के लिए हैं।

उन्हें क्लास के बाहर नहीं बुलाया जाना चाहिए।

निजी क्षेत्रों में आंतरिक उपयोग के लिए डेटा होता है।

उन्हें कक्षा के बाहर से (सीधे) पढ़ा या लिखा नहीं जाना चाहिए।

नोट: यह ध्यान रखना बहुत महत्वपूर्ण है कि सिर्फ एक वेरिएबल में अंडरस्कोर जोड़ने से यह निजी नहीं हो जाता है, यह केवल एक नामकरण सम्मेलन है।


4
कम से कम, निजी क्षेत्रों का विचार है, लेकिन वे वास्तव में निजी नहीं हैं, आप उन्हें वैसे भी एक्सेस कर सकते हैं। उपरोक्त कोड के लेखक का मतलब सिर्फ उनके लिए निजी होना था। बस इतना ही।
Sander

बहुत बढ़िया, पता नहीं मुझे यह देखने में इतना समय क्यों लगा! धन्यवाद।
droid-zilla

21

जहाँ तक मुझे पता है, यह आमतौर पर एक निजी चर को इंगित करने के लिए उपयोग किया जाता है (लेकिन वास्तव में कोई गोपनीयता प्रदान नहीं करता है, बस एक सम्मेलन)।

यहाँ इसकी संक्षिप्त चर्चा की गई है, हालाँकि इनके विरुद्ध सलाह दी जाती है: http://javascript.crockford.com/code.html


3
मुझे यह लिंक पसंद है: "उन सम्मेलनों से बचें जो क्षमता की कमी को प्रदर्शित करते हैं।" :-)
Arek

मैं उन्हें शॉर्टकट के रूप में उपयोग करता हूं जब डिबगिंग, विशेष रूप से वादे और अन्य एसिंक्स सामान के साथ। उदाहरण के लिए, मेरी वस्तु की कुछ विशेषता तक पहुंचने का "आधिकारिक" तरीका हो सकता है, myObj.getSmePromise().then( function(o) { do stuff } );लेकिन यह क्रोम कंसोल पर टाइप करने के लिए एक दर्द है, इसलिए मैं myObj._someValueइस समझ पर सेट हूं कि "उचित कोड" वास्तव में इसे एक्सेस नहीं करेगा - हालांकि, इसके साथ है मेरे सहकर्मियों की विलासिता भी इस सम्मेलन को जान रही है, यदि आप अगला jQuery / लॉश / कोणीय / प्रतिक्रिया लिख ​​रहे हैं या जो कुछ भी मैं आपके सभी उपयोगकर्ताओं को यह जानने या सम्मान करने पर भरोसा नहीं करूँगा!
फ्रेडल

8

जब जैसा इस्तेमाल किया _varname यह चर नाम का सिर्फ एक हिस्सा होता है, और इसका कोई जावास्क्रिप्ट अर्थ नहीं होता है। डेवलपर्स इसका उपयोग चर के अर्थ या दायरे को सूचित करने के लिए करते हैं। इस मामले में ऐसा लगता है कि यह डेवलपर को बता रहा है कि यह चर स्थानीय या निजी चर होना चाहिए।

ध्यान देने योग्य कुछ बातें, इस विशेष उदाहरण _.varnameमें underscore.js लाइब्रेरी के साथ एक वैरिएबल या फ़ंक्शन को दर्शाया जाएगा। इसके अलावा _varname, एक अंडरस्कोर ऑब्जेक्ट को पकड़े हुए एक वैरिएबल को दर्शाने के लिए उपयोग किया जा सकता है , इसी तरह हमारे कार्यालय में, हम $varnameएक वैरिएबल को जेक्वेरी ऑब्जेक्ट से संकेतित करने के लिए उपयोग करते हैं।


4

इसका उपयोग संभवतः आंतरिक / निजी गुणों को चिह्नित करने के लिए किया जाता है। जैसे अजगर अंडरस्कोर के साथ एक वैरिएबल को उपसर्ग करता है, डेवलपर्स को यह बताने का एक आसान तरीका है कि एक वैरिएबल आंतरिक है और वे इसके साथ बेहतर छेड़छाड़ नहीं करते हैं (और यदि वे ऐसा करते हैं, तो इसमें शामिल लाइब्रेरी का मामूली अपडेट भी चीजों को तोड़ सकता है)।


2

आमतौर पर _उपयोगकर्ता / प्रोग्रामर को यह बताने के लिए उपयोग किया जाता है कि यह प्रश्न में एक निजी / संरक्षित चर है।


0

जैसा कि उल्लेख किया गया है, यह कई डेवलपर्स के बीच एक अभ्यास है, उस पर एक बुरा। यदि आपको अपने प्रोग्रामिंग तरीकों में इस तरह के सम्मेलनों का सहारा लेना है तो आपको भाषा का उपयोग करने का प्रयास करने से पहले भाषा, तरीके और पैटर्न सीखना चाहिए। यदि कोई आपके कोड में "अंडरस्कोर" के उपयोग के साथ सार्वजनिक / निजी तरीकों के बीच अंतर नहीं कर सकता है, तो आपके प्रलेखन कौशल में बहुत कमी है। वेब पर कई सार्वजनिक परियोजनाएं बहुत खराब तरीके से प्रलेखित हैं, यही वजह है कि शिक्षित डेवलपर्स द्वारा "अंडरस्कोर" सम्मेलनों को "सबसे अधिक" स्वीकार किया गया, जबकि अन्य ने औपचारिक डिजाइन पैटर्न और तरीकों को रखने के बजाय प्रवाह के साथ जाने का फैसला किया। एक कारण है कि "अंडरस्कोर" को ES6 / 7 संस्करणों में नहीं लिखा गया था।

एक ब्लॉग में मैं हाल ही में एक सॉफ्टवेयर इंजीनियर मैनेजर के सामने आया, जिन्होंने कहा: " अंडरस्कोर नामकरण सम्मेलन वास्तव में यह बताना आसान बनाता है, क्या एक चर समारोह सार्वजनिक या निजी होने का इरादा है। " मेरी प्रतिक्रिया है: "टिप्पणियां चित्रों की तरह हैं, इस मामले में वे एक हजार अंडरस्कोर हैं।

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

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


2
जब तक आप किसी फ़ंक्शन के स्रोत कोड को नहीं देख रहे हैं, आपको कोई टिप्पणी दिखाई नहीं देगी। यदि आप किसी और के पुस्तकालय / कोड का उपयोग कर रहे हैं, तो यह स्रोत या प्रलेखन को पढ़े बिना विधि के इरादे को देखने में सक्षम होने के लिए कुछ मूल्य जोड़ता है। अंडरस्कोर उपसर्ग इमो का कहना है कि यह एक गैर-सार्वजनिक एपीआई है जिस पर भरोसा नहीं किया जाना चाहिए।
सैम पी।

0

यह एक मामूली परिशिष्ट है। जैसा कि पहले ही उत्तर दिया गया है कि ये छद्म निजी चर हैं। लेकिन तब छद्म सार्वजनिक कार्यों को लिखना संभव है जो इन निजी चर तक पहुंचते हैं।

मैं एक सहकर्मी कोड से भ्रमित हो गया जो प्रभावी रूप से यह है (लेकिन एक अलग पुस्तकालय में बहुत गहराई तक दफन):

class x { 
  constructor(id) {this._id = id} 
  get id() {return this._id}
}
let y = new x(3)

अब आपके पास y.idऔर y._idवह दोनों काम हैं और उसी मूल्य को लौटाएँ। लेकिन अगर आप console.log(y)इसे करते हैं तो केवल _idकुंजी दिखाई देती है।

यहाँ छवि विवरण दर्ज करें

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