2015-06-23 11 views
10

में कोई अन्य विरासत में मिला है, तो मुझे ऐसी स्थिति है जहां मुझे यह जांचने की आवश्यकता है कि एक कन्स्ट्रक्टर (एक्स) के पास प्रोटोटाइप श्रृंखला (या स्वयं स्वयं है) में कोई अन्य कन्स्ट्रक्टर (वाई) है या नहीं।जांचें कि क्या किसी कन्स्ट्रक्टर को ES6

ऐसा करने का सबसे तेज़ माध्यम (new X()) instanceof Y हो सकता है। यह इस मामले में एक विकल्प नहीं है क्योंकि प्रश्नों के निर्माणकर्ता वैध तर्क के बिना तत्काल अगर फेंक सकते हैं।

अगले दृष्टिकोण मैं माना जाता है यह है:

const doesInherit = (A, B) => { 
    while (A) { 
    if (A === B) return true; 
    A = Object.getPrototypeOf(A); 
    } 

    return false; 
} 

काम करता है यही कारण है कि, लेकिन मैं समझ है कि मैं इस जांच करने के लिए कुछ और सरल तरीके से याद कर रहा हूँ हिला नहीं कर सकते। क्या कोई है?

+0

'ऑब्जेक्ट .getPrototypeOf (ए) उदाहरण बी बी उदाहरण मुझे लगता है कि काम करना चाहिए। –

+0

यही वह है जो मैं ऊपर उपयोग कर रहा हूं (लेकिन == के साथ), और यह काम करता है (हालांकि इसे लूप किया जाना चाहिए, क्योंकि विरासत हमेशा प्रत्यक्ष नहीं होती है)। या शायद मैं गलत समझ सकता हूँ? – Semicolon

+0

नहीं, मेरा मुद्दा लूपिंग के बजाय 'Object.getPrototypeOf (ए) उदाहरण बी 'का उपयोग करना है। आप कुछ पूरी तरह से अलग कर रहे हैं: पी –

उत्तर

19
जिस तरह से काम करता है के instanceof

, आप

A.prototype instanceof B 

ऐसा करने में सक्षम होना चाहिए लेकिन ऐसा केवल परीक्षण विरासत, आप A === B तुलना करने के लिए आत्म संदर्भ के लिए परीक्षण करने के लिए होना चाहिए होगा:

A === B || A.prototype instanceof B 

Babel example:

class A {} 
class B extends A {} 
class C extends B {} 

console.log(C === C) // true 
console.log(C.prototype instanceof B) // true 
console.log(C.prototype instanceof A) // true 

instanceof मूल रूप से इस प्रकार लागू किया गया है:

function instanceof(obj, Constr) { 
    var proto; 
    while ((proto = Object.getProtoypeOf(obj)) { 
    if (proto === Constr.prototype) { 
     return true; 
    } 
    } 
    return false; 
} 

यह वस्तु और चेक के प्रोटोटाइप श्रृंखला में iterates प्रोटोटाइप के किसी भी कंस्ट्रक्टर्स के बराबर होती है prototype संपत्ति है या नहीं।

तो लगभग आप जो कर रहे थे, लेकिन आंतरिक रूप से।

+1

धन्यवाद। 'Exampleof' तर्क भी जानना अच्छा है। मैं भूल रहा था कि एक कन्स्ट्रक्टर की प्रोटोटाइप संपत्ति स्वयं सुपर कन्स्ट्रक्टर का एक उदाहरण होगी - जैसा कि लोगों ने डर दिया था, 'वर्ग' चीनी मुझे मिल रही है:> – Semicolon

+0

आप गलती से दो उद्घाटन कोष्ठक डालते हैं ((प्रोटो। ..' – Fahmi

+0

@ फहमी: यह जानबूझकर, यह इंगित करने के लिए कि मैं वास्तव में यहां एक असाइनमेंट करना चाहता हूं और तुलना नहीं करता (यानी यह इंगित करता है कि '=' टाइपो नहीं है) –

13

Object.prototype.isPrototypeOf() भी है। एक आदर्श उपयोग मामले की तरह लगता है, नहीं?

Babel

class A {} 
class B extends A {} 
class C extends B {} 
console.log(C === C) 
console.log(B.isPrototypeOf(C)) 
console.log(A.isPrototypeOf(C)) 
+1

वाह, हाँ, यह बढ़िया है। यह वही है जो मैं कल्पना कर रहा था, लेकिन एमडीएन का पीछा करते समय मुझे इसे याद करना होगा। मेरी इच्छा है कि मैं दोनों उत्तरों को स्वीकार कर सकूं, लेकिन मैं फेलिक्स के साथ हरे रंग की जांच छोड़ने वाला हूं क्योंकि यह भी सही और गहन है। – Semicolon

+1

क्यों क्या मैंने कभी भी फ़ंक्शन का उपयोग नहीं किया है, भले ही यह ईएस 3 के बाद से मौजूद है ?? –

+0

कोई विचार नहीं है, लेकिन यह निश्चित रूप से रडार के नीचे उड़ता है। जब मैंने पहली बार इसे पढ़ा तो मैंने सोचा कि यह कुछ भविष्य-कल्पना था - उन ES6 * में से एक 'देखो कि हम अब तक भाषा में क्या भूल गए हैं' * विधियों के प्रकार। – Oka

1

सावधान: जाँच ES6 कक्षाएं एक के ऊपर जवाब, बी, isPrototypeOf साथ सी विरासत श्रृंखला() अच्छा काम करता है। लेकिन यह आप की तरह काम नहीं करता है पूर्व ES6 कक्षाएं वस्तु, सरणी, समारोह आदि

Object.prototype.isPrototypeOf (Array.prototype); // => true 

के लिए उम्मीद कर सकते हैं लेकिन:

Object.isPrototypeOf (Array); // => false 

यह है कि यह होना चाहिए। ऐरे के इंस्टॉलेशन ऑब्जेक्ट.प्रोटोटाइप के तरीकों का वारिस करते हैं। लेकिन "वर्ग" ऐरे "वर्ग" ऑब्जेक्ट का उत्तराधिकारी नहीं है। यदि आप ऑब्जेक्ट में कोई विधि जोड़ते हैं तो आप उसे ऐरे के माध्यम से कॉल नहीं कर सकते हैं। ऐरे ऑब्जेक्ट के तरीकों का वारिस नहीं करता है (अगर कोई है)। यह सिर्फ उपयोगकर्ता द्वारा निर्मित कक्षाएं अलग-अलग काम करती हैं!

शायद हमें ऑब्जेक्ट और ऐरे और फ़ंक्शन को "कक्षाएं" के रूप में नहीं सोचना चाहिए - भले ही आप उनके उदाहरण बना सकें। वे केवल "निर्माता" हैं। या हम कह सकते हैं कि वे कक्षाएं हैं लेकिन जावास्क्रिप्ट में निर्मित कक्षाएं उपयोगकर्ता द्वारा बनाए गए लोगों से अलग-अलग काम करती हैं।

+0

बहुत अच्छा मुद्दा, मैंने यह नहीं माना था। – Semicolon

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