2012-07-14 15 views
5

के बाद वर्तमान 'कक्षा का नाम' प्राप्त करें मैं कक्षा/फ़ंक्शन/प्रोटोटाइप विरासत के साथ थोड़ा सा खेल रहा था और एक सभ्य सेटअप काम कर रहा था। कुछ सरल जो मैं समझता हूं।कक्षा/प्रोटोटाइप विरासत

http://jsfiddle.net/rudiedirkx/rwPeD/6/

डीबगिंग उद्देश्यों के लिए, मैं प्रत्येक निर्माता वस्तु किस तरह का है कि निर्माता बुला रहा था में मुद्रित करने के लिए करना चाहता था। उदाहरण के लिए रोनीन कन्स्ट्रक्टर निंजा कन्स्ट्रक्टर को कॉल करता है और वह व्यक्ति कन्स्ट्रक्टर को कॉल करता है। उसके लिए मैं एक get_class समारोह बनाया:

function get_class(obj) { 
    var C = String(obj.__proto__.constructor); 
    return C.match(/function (\w+)\(/, C)[1]; 
} 

और वह काम नहीं करता। यह हमेशा "व्यक्ति" देता है। क्यूं कर? प्रत्येक 'वर्ग' का अपना कन्स्ट्रक्टर होता है, है ना? यदि मैं प्रत्येक कन्स्ट्रक्टर में console.log(this) करता हूं, तो Chrome Devtools जानता है कि ऑब्जेक्ट किस प्रकार है। मैं वहां कैसे जाऊं (वेनिला जेएस के साथ)?

पीएस। मेरी क्रोम में पूर्ण उत्पादन:

Chrome Devtools output

+0

के संभावित डुप्लिकेट [तुम क्यों भाग दौरान जावास्क्रिप्ट निर्माता पुनर्स्थापित करने के लिए की जरूरत है?] (Http://stackoverflow.com/questions/13222696/why-do पाया जा सकता है - आपको-रीसेट-टू-रीसेट-जावास्क्रिप्ट-कन्स्ट्रक्टर-ऑर्डर-विरासत) – Bergi

उत्तर

3

या आप कुछ है कि वास्तव में काम करता है कर सकता है ...

function getClass(obj) { 
    return obj.__proto__.constructor.name; 
} 

obj.attr ("वर्ग") तभी काम करता है विधि attr इसके साथ मौजूद है एक देशी वातावरण में नहीं होगा।

अभी भी आपका सुझाव इसके डिजाइन में बहुत अच्छा था।

कृपया ध्यान दें कि आद्य .constructor.name हमेशा वापस आ जाएगी "ऑब्जेक्ट" अगर वर्ग एक देशी वर्ग, इस तरह के सरणी, स्ट्रिंग, रेगुलर एक्सप्रेशन, त्रुटि, आदि के रूप में नहीं है ... किसी को समझाने के लिए कैसे जानता है वास्तविक नाम वापस करने के लिए "नाम" संपत्ति, भले ही मुझे इसे करने के लिए कोड जोड़ना पड़े, मैं उसे अपनी परेशानी के लिए केला खरीदूंगा।

+0

यदि 'obj .__ proto __। कन्स्ट्रक्टर हमेशा 'व्यक्ति' कन्स्ट्रक्टर लौटाता है, तो 'obj .__ proto __। constructor.name' हमेशा" व्यक्ति " ... यह वही विधि है जिसकी मैंने कोशिश की और यह नहीं है। यदि यह आपके लिए काम करता है, तो क्या आप इसे http://jsfiddle.net/rudiedirkx/rwPeD/6/ में कार्यान्वित कर सकते हैं? धन्यवाद – Rudie

+0

काम नहीं करता है जब स्क्रिप्ट गतिशील रूप से लोड होते हैं (उदाहरण के लिए requ.js के साथ) – catbadger

+0

त्रुटि संदेश: this.__proto__.constructor.name कोई फ़ंक्शन नहीं है –

0

मुझे लगता है कि समस्या निम्न पंक्ति को संदर्भित करती है। this.prototype.constructor अंक क्या है। प्रोटीोटाइप इंगित करता है।

this.prototype = Object.create(sup.prototype); 

आपको इसके संदर्भ को स्पष्ट रूप से बदलने की आवश्यकता हो सकती है।

this.prototype.constructor = this; 

समान प्रश्न Get name of derived constructor in Javascript पर

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