Object(window)
कभी भी window
क्लोन नहीं करेगा लेकिन new Object(window)
हो सकता है। सभी मौजूदा - संभावित रूप से सभी ज्ञात - कार्यान्वयन केवल एक ही संदर्भ को वापस करते हैं, हालांकि spec कार्यान्वयन-परिभाषित व्यवहार के लिए अनुमति देता है।
15.2.1.1 के लिए चरणों का
कहते हैं:
- यदि मान, अशक्त अपरिभाषित है या नहीं की आपूर्ति की है, बना सकते हैं और एक नई वस्तु वस्तु लौट बिल्कुल के रूप में करता है, तो मानक निर्मित वस्तु निर्माता कहा जाता है किया गया था उसी तर्क के साथ
- वापसी ToObject (मान)।
ToObject
(9,9) की परिभाषा में कुछ प्रकार है कि चरण 1 (तालिका 14 में) द्वारा पकड़ा हो जाएगा सूचीबद्ध करता है, लेकिन Object
के लिए एक बहुत ही सरल परिभाषा है:
परिणाम है इनपुट तर्क (कोई रूपांतरण नहीं)।
यह स्पष्ट रूप से कहता है कि इनपुट तर्क के रूप में वापस किया जाएगा, इसलिए वे बराबर संदर्भ (===
) होना चाहिए।
के लिए new Object
(15.2.2.1) परिभाषा चरण 1 में टाइप-जांच की एक ऐसी ही श्रृंखला है, लेकिन वस्तुओं के लिए कदम (1.a) है:
मैं। यदि मान मूल ईसीएमएस्क्रिप्ट ऑब्जेक्ट है, तो कोई नई ऑब्जेक्ट न बनाएं लेकिन केवल मूल्य वापस करें।
ii। यदि मान होस्ट ऑब्जेक्ट है, तो क्रियाएं की जाती हैं और परिणाम कार्यान्वयन-निर्भर तरीके से वापस आ जाता है जो होस्ट ऑब्जेक्ट पर निर्भर हो सकता है।
यही है, किसी भी मेजबान वस्तु foo
के लिए, कॉल Object(foo)
चाहिए === foo
लेकिन new Object(foo)
मई === foo
।
होस्ट वस्तुओं 4.3.8 में परिभाषित कर रहे हैं
वस्तु मेजबान वातावरण द्वारा आपूर्ति ECMAScript के निष्पादन के वातावरण को पूरा करने के किया जाना है।
This answer सूचियों में कुछ मेजबान वस्तुओं को शामिल करने के window
, history
, आदि new Object(foo)
चाहिए के माध्यम से उन चल रहा है (लेकिन नहीं है) एक अलग वस्तु लौटने।
किसी भी मामले लेकिन एक मेजबान वस्तु गुजर में, new Object(foo)
एक और अधिक जटिल श्रृंखला है कि Object(foo)
के रूप में ज्यादा एक ही तरीके से ToObject
को defers हो रहा है।
दुर्भाग्यवश, 15.2.2.1.1.a.ii बताता है कि "परिणाम कार्यान्वयन-निर्भर तरीके से वापस आ गया है" और इसमें "क्रियाएं [उन] किए गए कार्यों" के बारे में कोई विशिष्ट जानकारी नहीं है और ऐसा लगता है कि क्रोम सूचीबद्ध सभी "होस्ट ऑब्जेक्ट्स" के लिए एक ही ऑब्जेक्ट (बराबर संदर्भ) लौटाएं।
जाँच करने के लिए इस स्क्रिप्ट का उपयोग करना:
var objects = [
/* Native objects */
'Object', 'Date', 'Math', 'parseInt', 'eval',
/* Host objects */
'window', 'document', 'location', 'history', 'XMLHttpRequest', 'setTimeout'
];
function getDefinedReference(name) {
if (eval('typeof ' + name) !== 'undefined') {
return eval(name);
} else {
throw new Error('' + name + ' is not defined.');
}
}
function checkIdentity(name) {
try {
var ref = getDefinedReference(name);
var no = new Object(ref);
var o = Object(ref);
console.log(name, ref === no, ref === o, no === o);
if (ref === o && no !== o) {
// Make sure ref === Object(ref) but not new Object(ref)
console.log(name, 'returns different references.');
}
} catch (e) {
console.warn(e);
}
}
objects.forEach(checkIdentity);
if (typeof window !== 'undefined') {
for (var f in window) {
checkIdentity(f);
}
}
जहां Object
और new Object
व्यवहार अलग ढंग से किसी भी वस्तुओं नहीं मिल रहा है। @ Xotic750 सही लगता है कि यह कार्यान्वयन-निर्भर हो सकता है, लेकिन कोई भी इसका उपयोग नहीं कर रहा है।
जेएस रूम लोग (अर्थात् जन ड्रोकोवा) ने अनुमान लगाया कि इसे होस्ट ऑब्जेक्ट्स के साथ करना है, लेकिन मैं वास्तव में कोई फर्क नहीं पड़ता था। –
'नया ऑब्जेक्ट' होस्ट ऑब्जेक्ट्स पर क्रियान्वयन-परिभाषित है। मैं अभी भी एक उदाहरण देखना चाहता हूं जब यह पहचान नहीं है। –
क्या यह उन प्रसिद्ध प्रश्नों में से एक होगा? –