5

मैं जावास्क्रिप्ट में वर्ग नाम उत्पन्न करने के नियमों को निर्धारित करने की कोशिश कर रहा हूं। मैं क्रोम देव उपकरणों कंसोल में इस स्क्रिप्ट चिपकाया:क्रोम देव उपकरण में कस्टम कक्षाओं के लिए जावास्क्रिप्ट क्लास नामों की गणना कैसे की जाती है?

var obj = { 
    Constr : function() { } 
}; 

var obj2 = obj; 
console.log(new obj.Constr()); 
console.log(new obj2.Constr()); 

obj2.Constr2 = function() { }; 
console.log(new obj.Constr2()); 
console.log(new obj2.Constr2()); 

और यहाँ कंसोल में परिणाम हैं:

obj.Constr 
obj.Constr 
obj2.Constr2 
obj2.Constr2 

ऐसा लगता है कि क्लास का नाम चर द्वारा निर्धारित किया जाता है कि निर्माता समारोह मूल रूप से असाइन किया गया था। मैं सटीक नियमों की तलाश में हूं जो सीडीटी इस नाम को उत्पन्न करने के लिए उपयोग करता है। साथ ही, क्या यह वही नाम है जो Google क्लोजर कंपाइलर पहचानता है?

मैंने यह देखने की कोशिश की है कि क्या मैं फ़ायरबग में समान व्यवहार पुन: उत्पन्न कर सकता हूं, लेकिन मुझे कंसोल में प्रिंट करने के लिए कक्षा के नाम नहीं मिलते हैं। एक माध्यमिक प्रश्न के रूप में, क्या किसी को यह पता है कि फायरबग में इसे कैसे देखना है?

उत्तर

3

जावास्क्रिप्ट में कोई कक्षा नहीं है, क्योंकि यह प्रोटोटाइप-आधारित ओओपी है, कक्षा-आधारित नहीं है। क्रोम स्पष्ट रूप से कंसोल में ऑब्जेक्ट के कुछ विवरण मुद्रित करने के लिए कुछ कम करता है, लेकिन यह मानक जावास्क्रिप्ट नहीं है - मानक में, ऑब्जेक्ट्स का कोई नाम नहीं है, और आप ऑब्जेक्ट से संबंधित वर्ग के नाम का पता नहीं लगा सकते हैं, चूंकि एकमात्र विरासत वास्तविक [[Prototype]] आंतरिक छद्म-संपत्ति के माध्यम से की जाती है, जो कि किसी भी नाम या "कक्षा" के साथ अपने स्वयं के अधिकार में एक वस्तु है। आमतौर पर, आप object.__proto__.constructor.name पर देखकर कक्षा के नाम के समान कुछ घटा सकते हैं, जो उस कार्य का नाम वापस कर देगा जो कि कन्स्ट्रक्टर है जिसके द्वारा ऑब्जेक्ट को तत्काल किया गया था; लेकिन इस समारोह गुमनाम हो सकता है, या आपके ब्राउज़र अमानक __proto__ संपत्ति का समर्थन नहीं कर सकते हैं, या वस्तु के प्रोटोटाइप इसके निर्माता के लिए एक सही संदर्भ में नहीं हो सकता है। आम तौर पर, आप जेएस में किसी ऑब्जेक्ट की "कक्षा" नहीं जान सकते हैं; आप केवल अवरोध (object instanceof Constructor) के लिए परीक्षण कर सकते हैं, लेकिन यह अभी भी ऑब्जेक्ट प्रोटोटाइप में constructor संपत्ति के अनुसार कार्यान्वित किया गया है, जो गलत हो सकता है।

+1

तो, जैसा कि मुझे डर था, सीडीटी द्वारा मुद्रित नाम ecmascript चश्मा से नहीं आता है। यह डेवलपर के लिए केवल एक डीबगिंग सुविधा है। मैं जावास्क्रिप्ट के लिए बिल्कुल नया हूं और मुझे आम तौर पर प्रोटोटाइप शैली पसंद है, लेकिन मुझे यह निराशाजनक लगता है कि डोजो और एक्स्टज जैसे पुस्तकालय प्रोग्रामिंग के ओओ शैली में शूहोर्न करने की कोशिश करते हैं। मुझे लगता है कि यह जावास्क्रिप्ट की बेहतर सुविधाओं में से एक है। –

+1

जावास्क्रिप्ट एक _very_ ओओ भाषा है, और वास्तव में इसमें काफी लचीला है। जावास्क्रिप्ट के एक विशिष्ट वर्ग-आधारित ओओ _on top_ के निर्माण के बहुत सारे पुस्तकालय हैं, और आमतौर पर यह काफी अच्छी तरह से काम करता है। यह उन पुस्तकालयों या जावास्क्रिप्ट के लिए जरूरी नहीं है। – lanzz