2016-01-03 10 views
5

में सुपरक्लास नाम प्राप्त करें मेरे पास एक कक्षा है, और एक और वर्ग जो उस वर्ग को फैलाता है।ईएस 6

class Shape { 
    constructor() { 
    return this; 
    } 
} 
class Circle extends Shape { 
    constructor() { 
    super(); 
    return this; 
    } 
} 
let foo = new Circle(); 

मैं

let className = foo.constructor.name 
// returns string 'Circle' 

साथ foo की क्लास प्राप्त कर सकते हैं यह संभव है एक समान तरीके से foo के सुपर क्लास ('आकार') के नाम पाने के लिए?

+1

'foo .__ proto __। Constructor.name'? मुझे लगता है कि '__proto__' मानकीकृत भी किया गया है। –

+2

इससे आपको अभिभावक वर्ग मिल जाएगा, लेकिन जरूरी नहीं कि वह वर्ग जिस वस्तु को सीधे विस्तारित कर रहा था, या जिसे मूल रूप से विस्तारित किया गया था। – joshstrike

+0

धन्यवाद जनवरी - जो मुझे मूल कक्षा दोबारा देता है, लेकिन foo.__proto__.__proto__.constructor.name इसे प्राप्त करता है। – joelg

उत्तर

0

आपका अंतिम सुपरक्लास हमेशा ऑब्जेक्ट होता है, इसलिए इसे प्राप्त करने का कोई मतलब नहीं है। आपको यह जांचने की आवश्यकता है कि प्रश्न में उदाहरण 'है' कीवर्ड का उपयोग करके किसी और चीज का उदाहरण है या नहीं। मैं इसे एक्शनस्क्रिप्ट -3 परिप्रेक्ष्य से लिख रहा हूं, इसलिए मुझे यकीन नहीं है कि सिंटैक्स ईएस -6 में क्या है, लेकिन यह "अगर (यह आकार है)" के साथ होना चाहिए। यह सच हो जाएगा यदि प्रश्न में उदाहरण उस वर्ग को बढ़ाता है जिसके बारे में आप बात कर रहे हैं, अन्यथा झूठी।

हालांकि आप जो पूछ रहे हैं वह है जहां मानक लाइब्रेरी या मानक ऑब्जेक्ट से आकार शाखाएं हैं, और कंपाइलर या रनटाइम इसे समझने का कोई तरीका नहीं है। सिद्धांत रूप में यह बहुत अच्छा होगा अगर ईसीएमए भाषा आपको किसी दिए गए वर्ग के लिए विरासत की पिछली सरणी दे सकती है, लेकिन AFAIK जो कभी नहीं है और कभी भी सुविधा नहीं रही है। विरासत की पूरी श्रृंखला के बिना, आपको यह जानने की जरूरत है कि आप किस सुपरक्लस की तलाश में हैं या आप किसी भी तार्किक तरीके से इसे प्राप्त नहीं कर सकते हैं।

1

मिल गया:

let superClassName = foo.__proto__.__proto__.constructor.name 
// return Shape 

संपादित करें: इस जनक वर्ग है, जो जरूरी वर्ग सर्किल मूल रूप से बढ़ाया नहीं है देता है। मेरे उपयोग के मामले में वे वही हैं, लेकिन यहां 'सुपरक्लास' के अर्थ के बारे में सूक्ष्म अस्पष्टता है।

+2

'Object.getPrototypeOf'' __proto__' से अधिक मानक होगा। – loganfsmyth

+1

यह तत्काल माता-पिता वर्ग है, जरूरी नहीं कि वह सुपरक्लास जिसे आप ढूंढ रहे हैं। – joshstrike

+0

आह, धन्यवाद। वे मेरे लिए समान हैं, लेकिन मैं देख सकता हूं कि यह आवश्यक नहीं है। – joelg

3
Object.getPrototypeOf(Object.getPrototypeOf(foo)).constructor.name; 
संबंधित मुद्दे