अगर मैं सही ढंग से समझूं, तो जावास्क्रिप्ट में प्रत्येक वस्तु ऑब्जेक्ट प्रोटोटाइप से विरासत में मिली है
यह बालों को विभाजित करने की तरह लग सकता है, लेकिन जावास्क्रिप्ट (ECMAScript कार्यान्वयन के लिए सामान्य शब्द) और ECMAScript (जावास्क्रिप्ट कार्यान्वयन के लिए प्रयुक्त भाषा ) के बीच अंतर है । यह ECMAScript है जो एक विरासत योजना को परिभाषित करता है, जावास्क्रिप्ट नहीं, इसलिए केवल मूल ECMAScript ऑब्जेक्ट्स को उस विरासत योजना को लागू करने की आवश्यकता होती है।
एक रनिंग जावास्क्रिप्ट प्रोग्राम में कम से कम बिल्ट-इन ECMAScript ऑब्जेक्ट्स (ऑब्जेक्ट, फंक्शन, नंबर इत्यादि) होते हैं और शायद कुछ देशी ऑब्जेक्ट्स (जैसे फ़ंक्शंस)। इसमें कुछ होस्ट ऑब्जेक्ट भी हो सकते हैं (जैसे ब्राउज़र में DOM ऑब्जेक्ट, या अन्य होस्ट वातावरण में अन्य ऑब्जेक्ट)।
जबकि अंतर्निहित और देशी वस्तुओं को ECMA-262 में परिभाषित विरासत योजना को लागू करना चाहिए, मेजबान ऑब्जेक्ट नहीं करते हैं। इसलिए, जावास्क्रिप्ट वातावरण में सभी ऑब्जेक्ट्स Object.prototyp से इनहेरिट नहीं किए जाने चाहिए । उदाहरण के लिए, IE में होस्ट ऑब्जेक्ट्स को ActiveX ऑब्जेक्ट्स के रूप में कार्यान्वित किया जाता है यदि देशी ऑब्जेक्ट्स के रूप में व्यवहार किया जाता है (इसलिए क्यों प्रयास करें..कैसे MS XMLHttpRequest ऑब्जेक्ट्स को इनिशियलाइज़ करने के लिए उपयोग किया जाता है)। कुछ डोम ऑब्जेक्ट्स (जैसे IE में क्वॉडक मोड में NodeLists) यदि एरे तरीकों से पास किए गए हैं, तो त्रुटियों को फेंक दिया जाएगा, IE 8 और लोअर में डोम ऑब्जेक्ट्स में एक ECMAScript- इनहेरिटेंस स्कीम नहीं है, और इसी तरह।
इसलिए यह नहीं माना जाना चाहिए कि एक जावास्क्रिप्ट पर्यावरण में सभी वस्तुएं Object.prototype से विरासत में मिली हैं।
जिसका अर्थ है कि जावास्क्रिप्ट में प्रत्येक वस्तु की अपनी प्रोटोटाइप श्रृंखला के माध्यम से hasOwnProperty फ़ंक्शन तक पहुंच है
जो कि quirks मोड में IE में कुछ होस्ट ऑब्जेक्ट्स के लिए सही नहीं है (और IE 8 और हमेशा कम)।
उपरोक्त को देखते हुए, यह सोचने योग्य है कि किसी वस्तु की अपनी स्वयं की hasOwProProperty विधि क्यों हो सकती है और पहले परीक्षण के बजाय कुछ अन्य hasOwnProperty पद्धति को कॉल करने की सलाह दी जाती है यदि यह एक अच्छा विचार है या नहीं।
संपादित करें
मुझे संदेह है कि उपयोग करने का कारण Object.prototype.hasOwnProperty.call
यह है कि कुछ ब्राउज़रों में, होस्ट ऑब्जेक्ट में एक hasOwnProperty विधि नहीं है , कॉल का उपयोग करके और अंतर्निहित विधि एक विकल्प है। हालाँकि, ऐसा करना सामान्य रूप से उपरोक्त कारणों के लिए एक अच्छा विचार नहीं लगता है।
जहां मेजबान वस्तुओं का संबंध है, ऑपरेटर में गुणों के परीक्षण के लिए इस्तेमाल किया जा सकता है, उदाहरण के लिए
var o = document.getElementsByTagName('foo');
// false in most browsers, throws an error in IE 6, and probably 7 and 8
o.hasOwnProperty('bar');
// false in all browsers
('bar' in o);
// false (in all browsers? Do some throw errors?)
Object.prototype.hasOwnProperty.call(o, 'bar');
एक विकल्प (IE6 और अन्य में परीक्षण किया गया):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
इस तरह से आप केवल विशेष रूप से अंतर्निहित hasOwnProperty को कॉल करते हैं जहां ऑब्जेक्ट के पास यह नहीं है (विरासत में या अन्यथा)।
हालाँकि, यदि किसी ऑब्जेक्ट में कोई hasOwnProperty
विधि नहीं है , तो यह संभवतः ऑपरेटर के रूप में उपयोग करने के लिए उपयुक्त है क्योंकि ऑब्जेक्ट की संभावना एक उत्तराधिकार योजना नहीं है और सभी गुण ऑब्जेक्ट पर हैं (हालांकि यह केवल एक धारणा है), जैसे प्रॉपर्टी के लिए DOM ऑब्जेक्ट सपोर्ट के परीक्षण में ऑपरेटर एक सामान्य (और प्रतीत होता है सफल) तरीका है।