1) Object.create() एक खाली समारोह एफ कहा जाता है मैं सोच रहा हूँ एक समारोह एक प्रकार वस्तु के है कि बनाने के द्वारा बाहर शुरू होता है। यह एफ ऑब्जेक्ट कहां संग्रहीत किया जा रहा है? वैश्विक रूप से मुझे लगता है।
नहीं, यह Object.create
समारोह के स्थानीय गुंजाइश पर संग्रह किया गया है, हर बार जब आप आह्वान Object.create
इस समारोह F
बनाई जाएँगी।
तुम भी, एक और अधिक स्मृति कुशल कार्यान्वयन बना सकते हैं एक बंद पर F
भंडारण के द्वारा, और पुन: उपयोग यह:
if (typeof Object.create !== "function") {
Object.create = (function() {
function F() {} // created only once
return function (o) {
F.prototype = o; // reused on each invocation
return new F();
};
})();
}
2) हमारे oldObject इसके बाद, के रूप में ओ में पारित कर दिया, प्रोटोटाइप बन जाता है फंक्शनफंक्शन (यानी ऑब्जेक्ट) एफ में हमारे पुराने ऑब्जेक्ट से "विरासत" है, यह समझने के लिए कि नाम संकल्प इसके माध्यम से रूट करेगा। अच्छा, लेकिन मुझे उत्सुकता है कि डिफ़ॉल्ट प्रोटोटाइप ऑब्जेक्ट, ऑब्जेक्ट के लिए है? क्या यह फ़ंक्शन-ऑब्जेक्ट के लिए भी सच है?
सभी वस्तुओं यह एक आंतरिक संपत्ति है, हालांकि कुछ कार्यान्वयन आप इसे तक पहुँच, मोज़िला की तरह, obj.__proto__
संपत्ति के साथ जाने इस संपत्ति [[Prototype]]
के रूप में जाना जाता है, एक आंतरिक संपत्ति है कि प्रोटोटाइप श्रृंखला बनाता है।
डिफ़ॉल्ट [[Prototype]]
जब आप कोई नई ऑब्जेक्ट बनाते हैं, यानी var obj = {};
Object.prototype
है।
सभी कार्यों में prototype
संपत्ति है, इस संपत्ति का उपयोग Constructor के रूप में किया जाता है, जिसे new
ऑपरेटर के साथ बुलाया जाता है।
दृश्यों के पीछे यह एक नया ऑब्जेक्ट उदाहरण बनाया गया है, और यह ऑब्जेक्ट [[Prototype]]
इसके कन्स्ट्रक्टर की prototype
संपत्ति पर सेट है।
3) अंत में, एफ तत्काल है और लौटा, हमारा नया ऑब्जेक्ट बन गया। "नया" ऑपरेशन कड़ाई से आवश्यक है? क्या एफ पहले से ही प्रदान नहीं करता है, या क्या हमें फ़ंक्शन-ऑब्जेक्ट्स और गैर-फ़ंक्शन-ऑब्जेक्ट्स के बीच कोई महत्वपूर्ण अंतर है? स्पष्ट रूप से इस तकनीक का उपयोग कर कन्स्ट्रक्टर फ़ंक्शन होना संभव नहीं होगा।
हां, इस विधि में new
ऑपरेटर आवश्यक है। यदि आप यह कैसे काम करता के बारे में उत्सुक हैं
new
ऑपरेटर, एक वस्तु का [[Prototype]]
आंतरिक गुण सेट करने के लिए केवल मानक तरीका है, आप [[Construct]]
आंतरिक संचालन के लिए एक नज़र दे सकते हैं।
अगली बार ऑब्जेक्ट.क्रेट() कहा जाता है? वैश्विक फ़ंक्शन एफ ओवरराइट किया गया है? निश्चित रूप से यह पुन: उपयोग नहीं किया गया है, क्योंकि इससे पहले कॉन्फ़िगर किए गए ऑब्जेक्ट्स को बदल देगा। और क्या होता है यदि एकाधिक थ्रेड ऑब्जेक्ट.क्रेट() को कॉल करते हैं, तो किसी भी प्रकार की 0 पर शर्तों को रोकने के लिए सिंक्रनाइज़ेशन है?
अगली बार Object.create
शुरू हो जाती है, एक नया स्थानीय F
समारोह केवल विधि कॉल के दायरे के भीतर instantiated है, तो आप के बारे में दौड़ की स्थिति चिंता नहीं करनी चाहिए।
ध्यान दें कि यह कार्यान्वयन ECMAScript 5th Edition Specification में वर्णित Object.create
को उस विधि में वर्णित करता है, आप ऑब्जेक्ट को प्रारंभ करने के लिए एक संपत्ति डिस्क्रिप्टर पास कर सकते हैं।
सभी ब्राउज़र विक्रेता इसे कार्यान्वित कर रहे हैं (पहले से ही फ़ायरफ़ॉक्स 3.7 अल्फा, नवीनतम वीकिट नाइटली बिल्ड और क्रोम 5 बीटा पर उपलब्ध), इसलिए मैं आपको कम से कम यह जांचने की सलाह दूंगा कि मूल कार्यान्वयन इसे ओवरराइड करने से पहले मौजूद है या नहीं।
हम्म, स्थानीय क्षेत्र के कारण क्रॉकफ़ोर्ड के लिए कोई दौड़ की स्थिति नहीं है, लेकिन आपके पुन: उपयोग संस्करण के बारे में क्या है? –
@ क्रिस, कोई दौड़ की स्थिति भी नहीं, जावास्क्रिप्ट की प्रकृति एकल थ्रेडेड है, यहां तक कि [टाइमर और अन्य असीमित घटनाएं] (http://ejohn.org/blog/how-javascript-timers-work/) जैसे उपयोगकर्ता इंटरैक्शन निष्पादित किया जाता है अनुक्रमिक रूप से एक अवरुद्ध एकल धागे में। – CMS
उत्कृष्ट बिंदु-दर-बिंदु के लिए धन्यवाद! –