2010-10-11 10 views
24

निम्नलिखित कार्यक्रम मान लें:जावास्क्रिप्ट में कन्स्ट्रक्टर का नाम कैसे पुनर्प्राप्त करें?

var C = function() { }; 
x = new C(); 

अभिव्यक्ति x instanceof C सच पैदावार, तो x किसी भी तरह पता है कि यह समारोह C द्वारा बनवाया गया था है। x से सीधे C नाम पुनर्प्राप्त करने का कोई तरीका है?

(हाथ में मेरी समस्या में, मैं अपने आवेदन में संभव संकेतों को लागू करने प्रोटोटाइप के एक पदानुक्रम है। मैं एक संकेत है कि संकेत बनाने के लिए इस्तेमाल निर्माता के बराबर हो जाएगा के प्रकार का उपयोग करने के लिए है।)

उत्तर

24

क्रोम (7.0.544.0 देव), यदि मैं करता हूँ:

function C() { } 

var x = new C(); 

console.log(x.constructor.name); 

यह 'सी' प्रिंट ... लेकिन अगर सी एक अनाम के रूप में परिभाषित किया गया है जैसा कि आपके पास है, फ़ंक्शन इसके बजाय एक खाली स्ट्रिंग मुद्रित करेगा।

यदि मैं x.constructor प्रिंट करता हूं तो यह उसी चीज को प्रिंट करता है जैसा कि मैं आपके पास कोड में C प्रिंट करता हूं। उदाहरण के लिए ऑपरेटर को केवल इन दो मानों की तुलना करने की आवश्यकता है यह देखने के लिए कि वे true वापस करने में सक्षम हैं।

+0

मैंने सोचा कि कन्स्ट्रक्टर का उपयोग सरणी के सूचकांक के रूप में करने के लिए मुझे कन्स्ट्रक्टर की नाम स्ट्रिंग की आवश्यकता होगी। हालांकि, यदि सरणी अनुक्रमणिका के रूप में सीधे 'x.constructor' का उपयोग करना संभव है, तो मैं ठीक हो जाऊंगा। – Marc

+1

@Marc - जावास्क्रिप्ट में 'एसोसिएटिव सरणी' की सबसे नज़दीकी चीज एक वस्तु है। जावास्क्रिप्ट सरणी पूर्णांक का उपयोग कर अनुक्रमित हैं। यदि आप ऑब्जेक्ट के प्रॉपर्टी नाम के रूप में 'x.constructor' का उपयोग करते हैं (उदा।' मानचित्र [x.constructor] ') तो कन्स्ट्रक्टर प्रॉपर्टी की 'toString' विधि को पूरी तरह से बुलाया जाता है। – sje397

+0

धन्यवाद! मैं मुख्य रूप से पायथन में प्रोग्राम करता हूं ताकि आपकी व्याख्याएं जावास्क्रिप्ट ने चीजों को कैसे मदद की है। मैंने स्टैंड-अलोन राइनो दुभाषिया में x.constructor.toString() विधि की जांच की और यह मुझे अज्ञात कन्स्ट्रक्टर का स्रोत कोड देता है। – Marc

3

नहीं। C पर सीधे संदर्भ प्राप्त करने के लिए आप x.constructor का उपयोग कर सकते हैं, लेकिन यह एक अनाम कार्य है इसलिए इसका नाम प्राप्त करने का कोई तरीका नहीं है।

यदि यह इसलिए की तरह परिभाषित किया गया:

function C() { }; 
x = new C(); 

तो यह वापस आ स्ट्रिंग से x.constructor.toString() का उपयोग करें और समारोह के नाम पर बाहर पार्स करने के लिए संभव हो जाएगा। कुछ ब्राउज़र x.constructor.name[1] का भी समर्थन करेंगे।

[1] https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/name

0

आपके इस कोड को जिसे निर्माता को जानने की आवश्यकता है, क्या यह कन्स्ट्रक्टर फ़ंक्शन को ही एक्सेस कर सकता है? यदि ऐसा है, तो आप बस उस उदाहरण को कर सकते हैं।

ऐसा लगता है कि आपको इसे नाम से जानना होगा। यह खतरनाक लगता है। कोई भी एक और कन्स्ट्रक्टर बना सकता है जो एक ही नाम के साथ होता है और यह गुजरता है (जब तक कि आप वही नहीं चाहते हैं)।

7

इस कोड के रूप में यह एक गुमनाम समारोह नहीं है निर्माता का नाम है, जब तक मिल जाएगा:

obj.constructor.toString().match(/function (\w*)/)[1]; 

तुम क्यों वर्ग के नाम की आवश्यकता होगी? मान लीजिए कि आप JSON के माध्यम से क्लास इंस्टेंस को सहेजना और पुनर्स्थापित करना चाहते हैं। आप क्लास नाम को "टाइप" प्रॉपर्टी में स्टोर कर सकते हैं, और उसके बाद वस्तुओं को पुनर्स्थापित करने के लिए JSON.parse में एक रिज़ॉल्वर फ़ंक्शन का उपयोग कर सकते हैं। (नमूना कोड on this page देखें)।

तो, सिद्धांत रूप में आप एक सामान्यीकृत धारावाहिक बनाने के लिए ऊपर दिए गए कोड का उपयोग कर सकते हैं जो कि किसी भी वर्ग के उदाहरण को संभाल सकता है, लेकिन पार्सिंग फ़ंक्शन स्ट्रिंग बहुत अक्षम है।इस भूमि के ऊपर सभी वर्गों आप स्पष्ट रूप से प्रकार प्रदान करने के लिए स्टोर करने के लिए जा रहे हैं की आवश्यकता होती है से बचा जा सकता:

function Foo() {} 
Foo.prototype.type = 'Foo'; 

यह मूर्खतापूर्ण और अनावश्यक लगता है, जिसके कारण मैं खोज पर शुरू कर दिया परोक्ष वर्ग के नाम प्राप्त करने के लिए। लेकिन अंत में मैं में देना है: वहाँ :-(

1

जे एस में कोई स्वीकार्य समाधान है आप भी अपने वर्ग घोषणा कर सकते हैं इस:

var C = function C() { }; 

अब आप अपने C वर्ग निर्माता नहीं रह गया है एक गुमनाम समारोह है जिसका अर्थ है आप कर सकते हैं:

x = new C();  

console.log(x.constructor.name); // output: C 
0

कम से कम में प्रतिक्रिया यह हो सकता है

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

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