2010-04-03 11 views
5

मैं थोड़ी देर के लिए एक जावास्क्रिप्ट डेवलपर रहा हूं, और मैंने हमेशा सोचा है कि जावास्क्रिप्ट में निजी सदस्यों को लागू करने का सही तरीका डॉग क्रॉकफोर्ड द्वारा उल्लिखित तकनीक का उपयोग करना है: http://javascript.crockford.com/private.htmlGoogle की बंद लाइब्रेरी वास्तविक निजी सदस्यों का उपयोग क्यों नहीं करती है?

मुझे नहीं लगता था कि यह Google क्लोजर लाइब्रेरी का उपयोग शुरू करने तक जावास्क्रिप्ट ज्ञान का एक विशेष रूप से विवादास्पद टुकड़ा था। मेरी आश्चर्य की कल्पना करो ... पुस्तकालय क्रॉकफोर्ड-शैली की जानकारी छिपाने के लिए कोई प्रयास नहीं करता है। वे सब कुछ एक विशेष नामकरण सम्मेलन का उपयोग करते हैं और दस्तावेज में "निजी" सदस्यों को नोट करते हैं। मैं यह मानने की आदत में हूं कि Google के लोग आमतौर पर सॉफ़्टवेयर गुणवत्ता के अग्रणी किनारे पर होते हैं, तो क्या देता है? क्या श्री क्रॉकफोर्ड की सलाह का पालन करने के लिए कुछ नकारात्मकता है जो स्पष्ट नहीं है?

+0

मेरी राय के लिए http://stackoverflow.com/questions/1437712/how-to-override-private-variable-in-javascript/1438592#1438592 पर टिप्पणियों में चर्चा देखें – Christoph

उत्तर

8

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

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

दूसरा कारण यह है कि बहुत से Google प्रोग्रामर के पास पाइथन में पृष्ठभूमि होती है, जहां कोई निजी चीज नहीं होती है और अंडरस्कोर उपसर्ग स्वीकृत समुदाय मानक होता है।

+0

निजी बंद होने वाले वेरिएबल्स हैं गधे में दर्द जब डीबगिंग भी होता है: पी। दर्शन भी है कि जावास्क्रिप्ट एक वास्तविक ओओ भाषा नहीं है, और यह 'मूल रूप से' नहीं है (एक बेहतर शब्द की कमी के लिए मैं सोच सकता हूं) निजी चर का समर्थन करता है। – Matt

+1

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

0

आंखों की तुलना में जेएसडीओसी नोटेशन के लिए और भी कुछ है - जब आप Google क्लोजर कंपाइलर का उपयोग करते हैं, तो "@private" टैग पार्स किए जाते हैं और लागू होते हैं। यदि कोई बाहरी ऑब्जेक्ट इन चरों में से किसी एक तक पहुंचने का प्रयास करता है, तो संकलन त्रुटि उत्पन्न होती है। वास्तव में वे सामान्य क्रॉकफोर्ड विरासत पैटर्न के लिए दार्शनिक आपत्ति करते हैं: http://www.bolinfest.com/javascript/inheritance.php

1

goog.inherit() और goog.base() का उपयोग करके उनका विरासत मॉडल सुपरक्लास से सबक्लास तक प्रोटोटाइप सदस्यों की प्रतिलिपि बनाता है।

आप देख सकते हैं कि चीनी डॉग क्रॉकफोर्ड से कार्य समान है। विशेषाधिकार प्राप्त सदस्य (this.property) को विरासत में रखते हुए मैंने व्यक्तिगत रूप से कई समस्याओं का सामना किया है।

विरासत के दोनों तरीकों के साथ, निजी चर आसानी से सी ++ या जावा के विपरीत गायब हो जाते हैं जहां आपके पास सुपरक्लास 'निजी सदस्यों तक पहुंच नहीं है लेकिन वे अभी भी विरासत में हैं। यह इस कारण को पसंद करने का मुख्य कारण होना चाहिए।

संबंधित मुद्दे