मैं एक जावास्क्रिप्ट स्टैकट्रैक लाइब्रेरी लिख रहा हूं। लाइब्रेरी को गीलेर का पता लगाने की ज़रूरत है, किसी विशेष ऑब्जेक्ट या फ़ंक्शन प्रोग्रामर द्वारा बनाया गया था या पर्यावरण के हिस्से के रूप में था (अंतर्निहित वस्तुओं सहित)। होस्ट ऑब्जेक्ट्स उनके अप्रत्याशित व्यवहार के कारण थोड़ा समस्याग्रस्त हो रहे हैं, इसलिए मैं यह निर्धारित करने के लिए पर्यावरण-अज्ञेय तरीके से हूं कि जावास्क्रिप्ट में कोई विशेष ऑब्जेक्ट होस्ट ऑब्जेक्ट है (ECMAScript 3 - 4.3.8 देखें)। हालांकि, देशी वस्तुओं और आदिम मूल्यों से होस्ट ऑब्जेक्ट्स को अलग करना विशेष रूप से ब्राउज़र-कम वातावरण में प्रोग्रामर के लिए उपयोगी है, इसलिए मैं उस पर ध्यान केंद्रित करना चाहता हूं, बजाय मेरी लाइब्रेरी में या ऑब्जेक्टिंग प्रोग्रामर पर होस्ट ऑब्जेक्ट्स की समस्याएं -निर्मित वस्तुओं।जावास्क्रिप्ट होस्ट ऑब्जेक्ट्स का पता लगाने के लिए कोई पर्यावरण-अज्ञात तरीका है?
अभी तक मैं केवल समाधान के साथ आने में सक्षम हूं जो पर्यावरण जावास्क्रिप्ट कोड पर निर्भर करता है। उदाहरण के लिए:
// IE Only: does not implement valueOf() in Host Objects
var isHost = (typeof obj === 'object' && typeof obj.valueOf === 'undefined');
// Firefox Only: Host objects have own constructor
var isHost = (obj.constructor && obj.hasOwnProperty('constructor'));
मैंने देखा है कि jQuery के अपने isPlainObject() विधि को भी पर्यावरण पर निर्भर है, और तर्क नहीं बल्कि जटिल है।
शायद ऐसा इसलिए है क्योंकि मेजबान वस्तुओं के साथ जानवर की प्रकृति (क्योंकि उनका व्यवहार पर्यावरण द्वारा परिभाषित किया गया है), लेकिन मैं यह देखने के लिए कुछ और खोदना चाहता हूं कि यह संभव है या नहीं और सोच रहा था कि कोई चला गया है इस विशेष समस्या से पहले और एक समाधान तैयार है।
तो। क्या किसी को मेजबान ऑब्जेक्ट्स के परीक्षण के लिए एक सरल मंच-स्वतंत्र समाधान पता है? और यदि यह ब्राउज़र-कम वातावरण जैसे नोड या राइनो में चलता है तो इसके लिए बेहतर होता है।
संभावित दृष्टिकोण (जो काम नहीं कर सकते हैं):
- मेजबान वस्तुओं की विशेषताओं के लिए परीक्षण एक खो कारण की तरह लगता है, यह देखते हुए उनके व्यवहार के लिए कोई विनिर्देश है कि वहाँ है, तथापि परीक्षण है कि क्या वस्तु का हिस्सा है ईएस 3 विनिर्देश एक संभावना हो सकती है।
- मैं का उपयोग कर की कोशिश की है
Object.prototype.toString()
यह देखते हुए कि काफी विशेष रूप से अपनी परिभाषित है, लेकिन के रूप में कुछ वातावरण (अर्थात् आईई) देशी और मेजबान वस्तुओं के लिए समान मान के लिए चुन परिणाम अनिर्णायक हैं। - यह देखना हो प्रोटोटाइप श्रृंखला के माध्यम से एक वस्तु का परम
constructor
वास्तव में एकinstanceof Function
है द्वारा ऐसा करना संभव हो सकता है।
आप जिस समस्या को हल करने की कोशिश कर रहे हैं? –
मुझे पूरा यकीन है कि यह सभी वातावरण में काम नहीं करता है, लेकिन आप 'Object.prototype.toString.call (obj) 'को आजमा सकते हैं और देख सकते हैं कि आपको' [ऑब्जेक्ट ऑब्जेक्ट]' मिलता है (जो कि सादे ऑब्जेक्ट्स/उदाहरण हैं उपज) या कुछ ऐसा निर्धारित करने के लिए '[ऑब्जेक्ट HTMLBodyElement] 'जैसे कुछ होस्ट ऑब्जेक्ट है। – pimvdb
@ कैमिलो मार्टिन, मैं जावास्क्रिप्ट स्टैकट्रस लाइब्रेरी पर काम कर रहा हूं, मेजबान ऑब्जेक्ट्स उनके अप्रत्याशित व्यवहार के कारण थोड़ा समस्याग्रस्त हो रहे हैं, इसलिए उन्हें चारों ओर कोड करना होगा। हालांकि यहां अन्य समाधानों में विशेष रूप से ब्राउज़र-कम वातावरण में प्रोग्रामर के लिए समाधान उपयोगी है। –