जवाबों:
वे समकक्ष नहीं हैं। {}.constructor.prototype == Object.prototypeजबकि Object.create(null)कुछ से विरासत में नहीं मिलता है और इस तरह कोई भी गुण नहीं है।
दूसरे शब्दों में: एक जावास्क्रिप्ट ऑब्जेक्ट तब तक डिफ़ॉल्ट रूप से ऑब्जेक्ट से विरासत में मिलती है, जब तक कि आप इसे स्पष्ट रूप से इसके प्रोटोटाइप के रूप में अशक्त के साथ नहीं बनाते हैं: जैसे Object.create(null)।
{}इसके बजाय के बराबर होगा Object.create(Object.prototype)।
Chrome Devtool में आप देख सकते हैं कि Object.create(null)कोई __proto__संपत्ति नहीं है, जबकि {}है।
वे निश्चित रूप से समकक्ष नहीं हैं। मैं इस उत्तर को और अधिक पूरी तरह से समझाने के लिए लिख रहा हूं कि इससे क्या फर्क पड़ता है।
var p = {};
एक ऐसी वस्तु बनाता है जो गुणों और विधियों से विरासत में मिलती है Object।
var p2 = Object.create(null);
एक वस्तु बनाता है जो कुछ भी वारिस नहीं करता है।
यदि आप किसी ऑब्जेक्ट को मानचित्र के रूप में उपयोग कर रहे हैं, और आप उपरोक्त विधि 1 का उपयोग करके एक ऑब्जेक्ट बनाते हैं, तो आपको मैप में लुकअप करते समय अतिरिक्त सावधानी बरतनी होगी। क्योंकि गुण और विधियाँ Objectविरासत में मिली हैं, इसलिए आपका कोड एक ऐसे मामले में चल सकता है जहाँ आपके द्वारा डाले गए नक्शे में कुंजियाँ होती हैं। उदाहरण के लिए, यदि आपने एक खोज की, तो आपको toStringएक फ़ंक्शन मिल जाएगा, भले ही आपने उस मूल्य को कभी नहीं रखा हो। आप इस तरह के आसपास काम कर सकते हैं:
if (Object.prototype.hasOwnProperty.call(p, 'toString')) {
// we actually inserted a 'toString' key into p
}
ध्यान दें कि कुछ को असाइन करना ठीक है p.toString, यह बस विरासत में दिए गए toStringफ़ंक्शन को ओवरराइड करेगा p।
ध्यान दें कि आप सिर्फ p.hasOwnProperty('toString')इसलिए नहीं कर सकते क्योंकि आपने एक कुंजी "hasOwnProperty" में डाली होगी p, इसलिए हम इसे कार्यान्वयन में उपयोग करने के लिए बाध्य करते हैं Object।
दूसरी ओर, यदि आप ऊपर विधि 2 का उपयोग करते हैं, तो आपको Objectनक्शे में दिखाई देने वाली चीजों के बारे में चिंता करने की आवश्यकता नहीं होगी ।
आप ifइस तरह से एक संपत्ति के अस्तित्व की जांच नहीं कर सकते हैं :
// Unreliable:
if (p[someKey]) {
// ...
}
मान एक रिक्त स्ट्रिंग हो सकती है, हो सकता है false, या null, या undefined, या 0, या NaNयह जांचने के लिए कि क्या कोई संपत्ति मौजूद है, फिर भी आपको उपयोग करने की आवश्यकता होगी Object.prototype.hasOwnProperty.call(p, someKey)।
Object.create(null)। मैं इस तरह की धारणाएं नहीं बनाना पसंद करता हूं, भले ही आप बिल्कुल सही थे कि इसका इस्तेमाल किया गया था Object.create(null), कोड बदल सकता है, वस्तु को उस Objectबिंदु से बदला जा सकता है जो किसी बिंदु पर विरासत में मिला है । hasOwnPropertyहमेशा काम करता है।
{}इतना अधिक प्रचलित नहीं है Object.create(null), कि यदि आपका कोड गलती से इस स्थान पर विरासत में मिली संपत्ति को पकड़ लेता है, तो आपके पास चिंता करने के लिए बड़े कीड़े होने की संभावना है। मैं केवल मामूली अनुकूलन के रूप में Object.create (नल) का उपयोग करने वाले लोगों को देख सकता हूं।
!!p[key]साथ अच्छा काम करता है Object.create(null)। लेकिन hasKey = (key, input) => Object.prototype.hasOwnProperty.call(input, key)बुरा भी नहीं है
pक्योंकि हर विधि सम्मिलित की जा सकती है और इसलिए सुरक्षित नहीं है।
ऑब्जेक्ट का उपयोग करके ऑब्जेक्ट बनाना, {}जिसका प्रोटोटाइप है, Object.prototypeजो Objectप्रोटोटाइप से बुनियादी कार्यों को विरासत में मिला है, जबकि ऑब्जेक्ट का उपयोग करके ऑब्जेक्ट Object.create(null)बनाना एक खाली ऑब्जेक्ट बना देगा जिसका प्रोटोटाइप शून्य है।
अगर किसी को लागू करने की तलाश है Object.create(null), तो यह जानने के लिए कि यह कैसे काम करता है। यह प्रयोग __proto__किया जाता है जो गैर-मानक है और इसलिए, मैं इसकी सिफारिश नहीं करता हूं ।
function objectCreateMimic()
{
/*optional parameters: prototype_object, own_properties*/
var P = arguments.length>0?arguments[0]:-1;
var Q = arguments.length>1?arguments[1]:null;
var o = {};
if(P!==null && typeof P === "object")
{
o.__proto__ = P;
}
else if(P===null)
{
o.__proto__ = null;
}
if(Q!==null && typeof Q === "object")
{
for(var key in Q)
{
o[key] = Q[key];
}
}
return o;
}
नोट : मैंने इसे लिखा था, जिज्ञासा से बाहर, और यह केवल सरल शब्दों में लिखा गया है, उदाहरण के लिए, मैं संपत्ति के विवरणकर्ताओं को दूसरी वस्तु से रिटर्न ऑब्जेक्ट में स्थानांतरित नहीं कर रहा हूं।
-1में arguments.length>0?arguments[0]:-1;?
Objectपहला तर्क न दिए जाने पर प्रोटोटाइप को बरकरार रखा जाए। परिवर्तनीय नाम यहां बहुत बेहतर हो सकते हैं।
जब आप Object.create (नल) के साथ एक ऑब्जेक्ट बनाते हैं, तो इसका मतलब है कि आप बिना किसी प्रोटोटाइप के ऑब्जेक्ट बना रहे हैं। यहाँ नल का मतलब है प्रोटोटाइप श्रृंखला का अंत। फिर भी जब आप {} ऑब्जेक्ट प्रोटोटाइप बनाते हैं तो ऑब्जेक्ट जोड़ा जाएगा। इसलिए ये दो अलग-अलग वस्तुएं हैं, एक प्रोटोटाइप के बिना दूसरे के साथ। यह मदद करता है
if (someKey in p) {