2011-12-09 20 views
23

एक प्रोटोटाइप श्रृंखला के साथ इस तरह एक वस्तु पर विचार करें:instanceof बराबर

var A = {}; 
var B = Object.create(A); 
var C = Object.create(B); 

क्रम में कैसे जाँच करने के लिए करता है, तो सी अपने प्रोटोटाइप श्रृंखला में एक है?

instanceof फिट नहीं है क्योंकि यह कन्स्ट्रक्टर फ़ंक्शंस के साथ काम करने के लिए डिज़ाइन किया गया है, जिसका मैं यहां उपयोग नहीं कर रहा हूं।

उत्तर

21

मेरा जवाब कम हो जाएगा ...

आप isPrototypeOf विधि है, जो आपके वस्तु अपने उदाहरण की तरह, वस्तु प्रोटोटाइप से विरासत के मामले में उपस्थित रहेंगे इस्तेमाल कर सकते हैं।

उदाहरण:

A.isPrototypeOf(C) // true 
B.isPrototypeOf(C) // true 
Array.prototype.isPrototypeOf(C) // false 

अधिक जानकारी यहाँ पढ़ा जा सकता है: Mozilla Developer Network: isPrototypeOf

+1

+1 सरल समाधान। यद्यपि आपके उदाहरण पूरी तरह से सही हैं, फिर भी यह जांचने के लिए 'Array.prototype.isPrototypeOf (सी) 'होगा कि' सी' एक सरणी है (मुझे आपका आखिरी उदाहरण थोड़ा अस्पष्ट मिला - एक फ़ंक्शन पर 'isPrototypeOf' का उपयोग करना आमतौर पर नहीं होता है आपको क्या चाहिए)। – pimvdb

+0

आप बिल्कुल सही हैं, मैं उस समय उत्तर देने के बाद बहुत अधिक समय नहीं खोना चाहता था, इसलिए मैंने उदाहरणों पर बहुत कुछ नहीं सोचा था, मेरा उद्देश्य केवल उपलब्ध विधि को दिखाने के लिए था .. । फिर भी मैं आपके उत्तर के साथ दिए गए उदाहरण को सही कर दूंगा, जैसा कि आपने कहा था और मैं सहमत हूं, मेरा आखिरी उदाहरण संदिग्ध है, नोटिस के लिए धन्यवाद =) – Couto

+0

बस एक त्वरित प्रश्न: ऑब्जेक्ट से ऑब्जेक्ट नहीं प्राप्त करने के लिए ऑब्जेक्ट के लिए यह कैसे संभव है? किसी ऑब्जेक्ट में एक [[प्रोटोटाइप]] संदर्भ होता है कि प्रोटोटाइप की श्रृंखला के माध्यम से अंततः ऑब्जेक्ट.प्रोटोटाइप की ओर जाता है। –

4

आप Object.getPrototypeOf को दोबारा कॉल करके प्रोटोटाइप श्रृंखला के माध्यम से पुन: सक्रिय कर सकते हैं: http://jsfiddle.net/Xdze8/

function isInPrototypeChain(topMost, itemToSearchFor) { 
    var p = topMost; 

    do { 

     if(p === itemToSearchFor) { 
      return true; 
     } 

     p = Object.getPrototypeOf(p); // prototype of current 

    } while(p); // while not null (after last chain) 

    return false; // only get here if the `if` clause was never passed, so not found in chain 
} 
+0

+1 के बारे में भी 'क्या while' के साथ एक के पास * समान * जवाब पोस्ट करने के लिए, है, जो मैं डॉन 'था टी अक्सर नहीं देखते हैं। लेकिन आपका एक समारोह में बनाया गया है, जो कि अच्छा है। – RightSaidFred

+0

@ राइटसाइडफ्रेड: मजेदार, मैं इस तथ्य के बारे में भी सोच रहा था कि मैं 'डू' कीवर्ड का उपयोग कर रहा था जिसे मैं लगभग कभी नहीं करता। – pimvdb

+0

मुझे आश्चर्य है कि ES6 के लिए 'ऑब्जेक्ट.hasPrototype' प्रस्ताव नहीं है जो वास्तव में आपके कार्य करता है। यह 'ऑब्जेक्टफ्रेट' के रूप में एक प्राकृतिक पूरक 'उदाहरण' के रूप में लगता है 'नया कन्स्ट्रक्टर' है। यह एक समारोह को दूसरे तर्क के रूप में भी स्वीकार कर सकता है, जो फ़ंक्शन के 'प्रोटोटाइप' को लक्ष्य के रूप में उपयोग करेगा। – RightSaidFred

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