javascript - Determining the difference between new Object and new fn -
आप new object
और new fn
के बीच का अंतर कैसे निर्धारित करते हैं
आप __ प्रोटो __
या Object.getPrototypeOf
मौजूदा पर निर्भर नहीं हो सकते, क्योंकि वे IE या Opera में नहीं हैं। समाधान, fn
, जैसे instanceof fn
का स्थिर रूप से उपयोग नहीं हो सकता है। अपना खुद का Object.getPrototypeOf
लागू करना ठीक है। जरूरी नहीं है: यह अच्छा होगा यदि आपका समाधान अन्य फ़्रेमों से ऑब्जेक्ट के साथ काम करता है और फंक्शन सीरियलायज़ेशन का उपयोग नहीं करता है। यहां कुछ उदाहरण बेस कोड से शुरू करने के लिए:
var fn = function () {}; Fn.prototype = {}; Var x = नया एफएन, वाई = नया ऑब्जेक्ट; एफ एन = नल; // निषेध करने के लिए स्थिर संदर्भ fn // अपने पहचान समारोह को परिभाषित समारोह यहाँ है नया ऑब्जेक्ट (obj) {}; अलर्ट (isNewObject (x)! == isNewObject (y)? "Pass": "fail");
मुझे पूरा यकीन है कि आप ईएस 3 में ऐसा केवल मानक समर्थन के साथ नहीं कर सकते , और यहां क्यों है:
x
और y
सृष्टि को देखें।
var fn = function () { }; Fn.prototype = {}; Var x = नया एफएन, वाई = नया ऑब्जेक्ट;
जब x
चालू होता है, तो इसका आंतरिक [[प्रोटोटाइप]] fn.prototype
द्वारा संदर्भित वस्तु पर सेट किया जा रहा है (बस एक ऑब्जेक्ट
वस्तु जिसे आप fn.prototype
को नियत किया गया है)। ऑब्जेक्ट के कन्स्ट्रक्टर - fn
- फिर उस नव निर्मित वस्तु के संदर्भ में बुलाया जा रहा है, लेकिन चूंकि यह किसी भी तरह से ऑब्जेक्ट को बदल नहीं लेता है, हम उस कदम को अप्रासंगिक मान सकते हैं।
y
चालू होता है, तो इसकी आंतरिक [[प्रोटोटाइप]] को Object.prototype
पर सेट किया जाता है, जो कि एक ऑब्जेक्ट
वस्तु भी है इसके कंस्ट्रक्टर ( ऑब्जेक्ट
) को तब इस नवनिर्मित ऑब्जेक्ट के संदर्भ में भी बुलाया जा रहा है, लेकिन इसमें कुछ भी नहीं होता है। तो अब आप 2 ऑब्जेक्ट
ऑब्जेक्ट्स जो केवल उनके आंतरिक [[प्रोटोटाइप]] के अलग-अलग वस्तुओं का संदर्भ देते हैं - x
एक संदर्भ जो भी आपने fn.prototype
को निर्दिष्ट किया है और y
के संदर्भ Object.prototype
। उनकी आंतरिक [[कक्षा]] गुण समान हैं (अर्थात "ऑब्जेक्ट" के बराबर)
आप ES3 में [[प्रोटोटाइप]] तक सीधी पहुंच नहीं प्राप्त कर सकते हैं। आप instanceof
का उपयोग कर इसके बारे में कुछ अनुमान लगा सकते हैं, परन्तु जब से fn
आपके उदाहरण में समाप्त हो गया है intanceof
- आधारित अनुमान तस्वीर से बाहर है। / P>
अब, आप ऑब्जेक्ट
कन्स्ट्रक्टर को ऐसे तरीके से बढ़ा सकते हैं कि यह किसी तरह तत्काल ऑब्जेक्ट को बदल देगा। आप फिर एक ऑब्जेक्ट का निरीक्षण कर सकते हैं और इस संवर्धन का पता लगा सकते हैं। उदाहरण के लिए:
वस्तु = कार्य () {वापसी ({__: शून्य शून्य}); }
और उसके बाद:
फ़ंक्शन isNewObject (ऑब्जेक्ट) {वस्तु में वापस '__'; }
लेकिन यह निश्चित रूप से काम करेगा, जब ऑब्जेक्ट को नया ऑब्जेक्ट
के साथ बनाया जा रहा है, और नहीं, एक वस्तु का शाब्दिक - { }
। यह अन्यथा भी है, लेकिन मैं अभी उन्हें नहीं देख सकता।
Comments
Post a Comment