देशी वस्तुओं और मेजबान वस्तुओं के बीच अंतर क्या है?


90

क्या उत्तरार्द्ध केवल अप्रतिष्ठित फ़ंक्शन ऑब्जेक्ट्स को संदर्भित करता है जो एक कस्टम कंस्ट्रक्टर (जैसे, var पक्षी 1 = 1 बर्ड (;);) द्वारा बनाए गए थे।


2
ECMAScript विनिर्देश में मूल वस्तुएँ परिभाषित हैं, होस्ट ऑब्जेक्ट नहीं हैं।
— 08इमे विद सिप 30'11

6
एक DOM तत्व - कहते हैं, new Image()- एक मेजबान वस्तु है, उदाहरण के लिए।

@ LeftimeVidas: क्या कोई कारण है कि आपने एक टिप्पणी छोड़ दी है जो आपके उत्तर का खंडन करती है?
— user113716

@ - _._ Ӫ अब मेरी बात है:)
— asटाइम विद सिप

1
@ ObjectsimeVidas: आपकी टिप्पणी में कहा गया है कि होस्ट ऑब्जेक्ट ECMAScript विनिर्देश में परिभाषित नहीं हैं । आपका उत्तर बताता है "दोनों के लिए परिभाषाएं ECMAScript सट्टेबाजी में हैं" ।
— user113716

जवाबों:


133

दोनों शब्दों को ECMAScript विनिर्देशन में परिभाषित किया गया है:

मूल वस्तु

एक ECMAScript क्रियान्वयन में वस्तु जिसका शब्दार्थ मेजबान वातावरण के बजाय इस विनिर्देश द्वारा पूरी तरह से परिभाषित किया गया है।

नोट मानक मूल वस्तुएँ इस विनिर्देश में परिभाषित की जाती हैं। कुछ मूल वस्तुएँ अंतर्निहित हैं; दूसरों का निर्माण ECMAScript कार्यक्रम के निष्पादन के दौरान किया जा सकता है।

स्रोत: http://es5.github.com/#x4.3.6

मेजबान वस्तु

ईसीएमएस्क्रिप्ट के निष्पादन पर्यावरण को पूरा करने के लिए मेजबान वातावरण द्वारा आपूर्ति की गई वस्तु।

नोट कोई भी ऑब्जेक्ट जो मूल नहीं है वह एक होस्ट ऑब्जेक्ट है।

स्रोत: http://es5.github.com/#x4.3.8


कुछ उदाहरण:

मूल निवासी वस्तुओं: Object(निर्माता), Date, Math, parseInt, eval, जैसे स्ट्रिंग तरीकों indexOfऔर replace, सरणी के तरीकों, ...

होस्ट वस्तुओं (ब्राउज़र पर्यावरण कल्पना करते हुए): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...


8
उसे कुछ उदाहरण भी दें, मूल वस्तु: ऐरे, स्ट्रिंग .., होस्ट ऑब्जेक्ट: विंडो ...
— पोइलिन्का डोरिन

1
एक कस्टम अभिरक्षक के बारे में क्या? उदाहरण के लिए, पक्षी मेरी पोस्ट में
— 20

2
@ ObjectimeVidas: "तो यह एक मेजबान वस्तु है।" यह सही नहीं है। इस उत्तर मेंhost object वर्णित परिभाषा देखें ।
— user113716

1
ŠimeVidas: लेकिन कल्पना राज्यों 'का मान [[क्लास]] एक के आंतरिक संपत्ति मेजबान वस्तु किसी भी स्ट्रिंग मान हो सकता है सिवाय "तर्क", "सरणी", "बूलियन", "तिथि", "त्रुटि" से एक है, "फ़ंक्शन", "JSON", "गणित", "संख्या", "ऑब्जेक्ट" , "RegExp" और "स्ट्रिंग"। ' आंतरिक [[क्लास]] अपने बर्ड वस्तु की संपत्ति हो जाएगा 'Object', या के माध्यम से प्रस्तुत Object.prototype.toStringके रूप में '[object Object]'।
— user113716

2
@ IfimeVidas, मैं असहमत हूं, अगर Birdकोई उपयोगकर्ता परिभाषित फ़ंक्शन है, तो इसके शब्दार्थ ईएस विनिर्देश द्वारा "पूरी तरह से परिभाषित" हैं (फ़ंक्शन ऑब्जेक्ट कैसे काम करते हैं, वे कैसे बनाए जाते हैं, निष्पादित होते हैं, newऑपरेटर के साथ उपयोग किए जाते हैं , आदि), आदि। देशी वस्तु ... मैं एक उत्तर छोड़ सकता हूं ...
— क्रिश्चियन सी। साल्वाडो

28

यह स्पष्ट है कि यदि हम तीन प्रकार की वस्तुओं में अंतर करते हैं:

निर्मित वस्तुओं : String, Math, RegExp, Object, Functionआदि - कोर पूर्वनिर्धारित जावास्क्रिप्ट में हमेशा उपलब्ध वस्तुओं। ECMAScript युक्ति में परिभाषित।

होस्ट ऑब्जेक्ट : ऑब्जेक्ट window, जैसे , XmlHttpRequestडोम नोड्स और इतने पर, जो ब्राउज़र वातावरण द्वारा प्रदान किया जाता है। वे निर्मित वस्तुओं से अलग हैं क्योंकि सभी वातावरण में एक ही मेजबान वस्तु नहीं होगी। यदि जावास्क्रिप्ट ब्राउज़र के बाहर चलता है, उदाहरण के लिए Node.js की तरह सर्वर साइड स्क्रिप्टिंग भाषा के रूप में, विभिन्न होस्ट ऑब्जेक्ट उपलब्ध होंगे।

उपयोगकर्ता ऑब्जेक्ट : जावास्क्रिप्ट कोड में परिभाषित ऑब्जेक्ट। तो आपके उदाहरण में 'बर्ड' एक उपयोगकर्ता वस्तु होगी।

जावास्क्रिप्ट कल्पना समूह निर्मित वस्तुओं और उपयोगकर्ता वस्तुओं को एक साथ देशी वस्तुओं के रूप में । यह शब्द "देशी" का एक अपरंपरागत उपयोग है, क्योंकि उपयोगकर्ता ऑब्जेक्ट स्पष्ट रूप से जावास्क्रिप्ट में कार्यान्वित किए जाते हैं, जबकि बिल्ट-इन को संभवतः हुड के नीचे एक अलग भाषा में लागू किया जाता है, जैसे कि मेजबान ऑब्जेक्ट होगा। लेकिन जावास्क्रिप्ट युक्ति के परिप्रेक्ष्य से, दोनों निर्मित और उपयोगकर्ता ऑब्जेक्ट जावास्क्रिप्ट के मूल निवासी हैं क्योंकि वे जावास्क्रिप्ट कल्पना में परिभाषित किए गए हैं, जबकि मेजबान ऑब्जेक्ट नहीं हैं।


मूल वस्तुएँ उन वस्तुओं को संदर्भित करती हैं जो जावास्क्रिप्ट कार्यान्वयन (इंजन) द्वारा बनाई गई हैं। अंतर्निहित और अन्य मूल वस्तुओं (उपयोगकर्ता ऑब्जेक्ट) के बीच अंतर यह है कि पूर्व वस्तुएं वर्तमान ईसीएमए नियमों का अनुपालन करते हुए जावास्क्रिप्ट प्रोग्राम की शुरुआत के बाद से मौजूद हैं। ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/… ) के बाद से, यह वस्तुओं को वर्गीकृत करने के लिए शब्दावली से ऊपर का उपयोग नहीं करता है। नीचे मेरे उत्तर का संदर्भ लें।
— जवा

17

यहाँ कल्पना की मेरी समझ है।

यह:

var bird = new Bird();

... एक देशी वस्तु में परिणाम जो बस newऑपरेटर के उपयोग से बनाया जाना था ।

मूल वस्तुओं में एक आंतरिक [[वर्ग]] निम्नलिखित में से एक की संपत्ति है:

"तर्क", "एरे", "बुलियन", "दिनांक", "त्रुटि", "कार्य", "जॉन्सन", "गणित", "संख्या", "वस्तु", "RegExp", और "स्ट्रिंग" ।

आपके लिए bird1यह होगा:

"ऑब्जेक्ट"

जैसे अगर आप कोई फंक्शन बनाते हैं:

function my_func() {
    // ...
}

... my_funcECMAScript में परिभाषित नहीं है, लेकिन यह अभी भी आंतरिक [[वर्ग]] के साथ एक मूल वस्तु है।]

"समारोह"

एक मेजबान वस्तु पर्यावरण द्वारा प्रदान की गई वस्तु है जो विनिर्देश द्वारा परिभाषित उस वातावरण के लिए एक विशिष्ट उद्देश्य की सेवा करने के लिए है।

उदाहरण के लिए:

var divs = document.getElementsByTagName('div')

द्वारा संदर्भित वस्तु divsएक नोडलिस्ट है , जिसे पर्यावरण में इस तरह से एकीकृत किया जाता है कि यह एक नियमित जावास्क्रिप्ट ऑब्जेक्ट की तरह लगता है, फिर भी यह विनिर्देश द्वारा कहीं भी परिभाषित नहीं है।

इसकी आंतरिक [[वर्ग]] संपत्ति है:

"NodeList"

यह कार्यान्वयन डिजाइनरों को पर्यावरण की विशिष्ट आवश्यकता के लिए कार्यान्वयन को सूट करने में कुछ लचीलापन प्रदान करता है।

होस्ट ऑब्जेक्ट्स की आवश्यकताएं हैं जो पूरे कल्पना में परिभाषित की गई हैं।


2
+1, मैं आपसे सहमत हूँ, birdऔर Birdकर रहे हैं देशी वस्तुओं , उन्हें एक उपयोगकर्ता परिभाषित समारोह (हैं Bird), और एक वस्तु ( bird) एक निर्माता के रूप में समारोह के उपयोग के द्वारा बनाई गई, यह सब के शब्दों कल्पना पर परिभाषित कर रहे हैं। मेजबान वस्तुओं के बारे में, पर बहुत ज्यादा भरोसा नहीं है [[Class]]आंतरिक संपत्ति, उदाहरण के लिए window.alertहै "Function"इसके के मूल्य के रूप में [[Class]]संपत्ति लगभग सभी कार्यान्वयन, यह है IE पर "Object", और यह अभी भी एक मेजबान वस्तु है ...
— ईसाई सी Salvado

साभार @CMS हाँ, मैं आंतरिक उपयोग पर बहुत अधिक जोर देने का मतलब नहीं था [[Class]]। केवल इसे एक मूर्त झलक के रूप में उपयोग करने के लिए कि कैसे कार्यान्वयनकर्ताओं ने विभिन्न प्रकार की वस्तुओं की व्याख्या की है। तो फिर window.alertएक आंतरिक होने [[Class]]की "Function"ES 5 का उल्लंघन होने लगते हैं?
— user113716

मैं इस ऐन कार्रवाई को देखने के लिए कोशिश कर रहा हूँ, लेकिन अगर मैं typeof कि div मिलता है, divs/NodeList, मैं एक मिल object। मैं अनुमान लगा रहा हूँ कि मुझे यह अभी तक समझ में नहीं आया है, लेकिन क्या यह इसे मूल वस्तु नहीं बनाएगा?
— मार्क बी

यह मददगार है । windowसभी होस्ट ऑब्जेक्ट्स में सब कुछ प्राप्त करना
— मार्क बी

बर्ड एक मूल वस्तु नहीं है क्योंकि यह इंटरफ़ेस ECMASCript मानक में पूरी तरह से वर्णित नहीं है। यह वास्तव में इतना आसान है। ऑब्जेक्ट मूल है और स्ट्रिंग मूल है, लेकिन उपयोगकर्ता-परिभाषित या होस्ट-परिभाषित ऑब्जेक्ट मूल नहीं हैं।
— स्कॉट मार्कस

3

इस सवाल का एक ठोस जवाब नहीं देख सका कि var bird1 = new Bird();यह एक देशी या मेजबान वस्तु है। मान लें कि बर्ड एक उपयोगकर्ता परिभाषित फ़ंक्शन है, तो एक देशी गैर-अंतर्निहित ऑब्जेक्ट जावास्क्रिप्ट कार्यान्वयन द्वारा http://es5.github.io/#x13.2 के अनुसार बनाया जाएगा । इसके विपरीत, देशी निर्मित मेंऑब्जेक्ट्स एक जावास्क्रिप्ट प्रोग्राम (जैसे ऑब्जेक्ट और कई अन्य) की शुरुआत के बाद से मौजूद होंगे। एक देशी वस्तु और एक मेजबान वस्तु के बीच अंतर यह है कि पूर्व जावास्क्रिप्ट कार्यान्वयन द्वारा बनाया गया है और बाद वाला मेजबान वातावरण द्वारा प्रदान किया गया है। परिणामस्वरूप मेजबान आंतरिक वस्तु [[वर्ग]] संपत्ति बिल्ट-इन ऑब्जेक्ट्स (यानी "तर्क", "एरे", "बुलियन", "दिनांक", "त्रुटि", "फ़ंक्शन", "द्वारा उपयोग की जाने वाली वस्तुओं से भिन्न हो सकती है) JSON "," गणित "," संख्या "," ऑब्जेक्ट "," RegExp ", और" स्ट्रिंग ")।

इसके अलावा, यह ध्यान देने योग्य है कि ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf शब्दावली देशी और मेजबान वस्तुओं का उपयोग नहीं करता है। इसके बजाय, यह ऑब्जेक्ट प्रकारों को परिभाषित करता है, उनके इच्छित व्यवहार के अधिक स्पष्ट स्पष्टीकरण के साथ।

4.3.6 साधारण वस्तु

ऑब्जेक्ट जो आवश्यक आंतरिक विधियों के लिए डिफ़ॉल्ट व्यवहार है जो सभी वस्तुओं द्वारा समर्थित होना चाहिए

4.3.7 विदेशी वस्तु

वह वस्तु जिसमें एक या एक से अधिक आवश्यक आंतरिक विधियों के लिए डिफ़ॉल्ट व्यवहार नहीं होता है जो सभी वस्तुओं द्वारा समर्थित होना चाहिए। कोई भी वस्तु जो एक सामान्य वस्तु नहीं है वह एक विदेशी वस्तु है।

4.3.8 मानक वस्तु

ऑब्जेक्ट जिसका शब्दार्थ इस विनिर्देश द्वारा परिभाषित किया गया है

4.3.9 निर्मित वस्तु

ECMAScript कार्यान्वयन द्वारा निर्दिष्ट और आपूर्ति की गई वस्तु


3

होस्ट ऑब्जेक्ट के संबंध में अन्य उत्तरों के अलावा।

होस्ट ऑब्जेक्ट एक वातावरण के लिए विशिष्ट हैं। इसलिए ब्राउज़र ब्राउज़र ऑब्जेक्ट्स के बगल में, नोडज के लिए भी विशिष्ट ऑब्जेक्ट हैं।

उदाहरण के लिए, पहले मानक वस्तुओं के साथ शुरू करना जैसा कि जावास्क्रिप्ट में परिभाषित किया गया है। फिर ब्राउज़र / DOM के लिए सामान्य ऑब्जेक्ट। नोड की अपनी वस्तुएं हैं।

  1. मानक जावास्क्रिप्ट अंतर्निहित वस्तु उदाहरण:

  2. होस्ट ऑब्जेक्ट दस्तावेज़ ऑब्जेक्ट मॉडल उदाहरण:

  3. Node.js में होस्ट ऑब्जेक्ट :


1

तीन वस्तुओं को ध्यान में रखते हुए: मेजबान, मूल निवासी, कस्टम।

होस्ट ऑब्जेक्ट पर्यावरण द्वारा बनाए गए हैं और पर्यावरण विशिष्ट हैं। सबसे अच्छा ज्ञात वातावरण एक वेब-ब्राउज़र होगा, लेकिन एक अन्य मंच हो सकता है। वेब-ब्राउज़र में निर्मित होस्ट ऑब्जेक्ट विंडो ऑब्जेक्ट या दस्तावेज़ हो सकते हैं। आमतौर पर एक ब्राउज़र जावास्क्रिप्ट ऑब्जेक्ट को डॉक्यूमेंट ऑब्जेक्ट मॉडल को जावास्क्रिप्ट में दर्शाने के लिए होस्ट ऑब्जेक्ट बनाने के लिए उपयोग करता है। (Webbrowser में अलग-अलग जावास्क्रिप्ट इंजन होते हैं जो ऐसा करते हैं) एक होस्ट ऑब्जेक्ट स्वचालित रूप से उस क्षण बनाया जाता है जब पृष्ठ किसी ब्राउज़र में रेंडर करता है।

एक नेटिव ऑब्जेक्ट डेवलपर द्वारा जावास्क्रिप्ट की पूर्वनिर्धारित कक्षाओं का उपयोग करके बनाया जाता है। मूल बातें आपके लिखित स्क्रिप्ट में हैं।

थान, एक कस्टम ऑब्जेक्ट डेवलपर द्वारा एक कस्टम (पूर्वनिर्धारित या आंशिक रूप से पूर्वनिर्धारित नहीं) वर्ग से बनाया जाता है।


0

मूल वस्तुएं वे वस्तुएं हैं जो ऐनक अर्थात "मानक वस्तुओं" का पालन करती हैं।

होस्ट ऑब्जेक्ट वे ऑब्जेक्ट हैं जो ब्राउज़र (या नोड की तरह अन्य रनटाइम वातावरण) प्रदान करता है।

अधिकांश होस्ट ऑब्जेक्ट मूल ऑब्जेक्ट होते हैं, और जब भी आप किसी चीज़ का उपयोग करके तुरंत करते हैं new, तो आप 99.99% सुनिश्चित हो सकते हैं कि यह एक मूल ऑब्जेक्ट है, जब तक कि आप अजीब होस्ट ऑब्जेक्ट के साथ गड़बड़ न करें।

IE (और अन्य पुराने ब्राउज़रों?) में बहुत ही विचित्र वस्तुओं की उपस्थिति के कारण यह धारणा शुरू की गई है । उदाहरण के लिए:

typeof document.all == "undefined"; // true
document.all.myElementId; // object

इसे देखते समय, हर कोई सहमत होगा कि document.allयह स्पष्ट रूप से "गैर-मानक" है, और इस प्रकार एक गैर-देशी मेजबान वस्तु है।

तो पहली जगह में देशी वस्तुओं को मानक वस्तु क्यों नहीं कहा जाता है ? सरल: सब के बाद, मानक (!) दस्तावेज़ गैर-देशी वस्तुओं के बारे में भी बात करता है, और उन्हें गैर-मानक कहता है से विरोधाभास होता है।

फिर:

  • देशी == "मानक"
  • होस्ट == ब्राउज़र या नोड या…
  • अधिकांश होस्ट ऑब्जेक्ट मूल हैं, और सभी गैर-होस्ट ऑब्जेक्ट भी मूल हैं

तुम वहाँ से थोड़ी दूर हो गए हो। "अधिकांश होस्ट ऑब्जेक्ट मूल हैं" गलत है। वास्तव में, परिभाषा के अनुसार सभी होस्ट ऑब्जेक्ट मूल नहीं हैं। देशी का अर्थ है "मानक" निश्चित रूप से, लेकिन इसका मतलब भाषा विनिर्देश में मानक है, सामान्य से बाहर के अर्थ में मानक नहीं। जावास्क्रिप्ट (ECMASCript) कई इंटरफेस / एपीआई को परिभाषित करता है जो ब्राउज़र और अन्य होस्ट द्वारा कार्यान्वित किए जाते हैं, जैसे: स्ट्रिंग, तिथि, MATH, बूलियन, संख्या, JSON और XmlHTTP। ये ऑब्जेक्ट उपलब्ध हैं क्योंकि होस्ट एक ECMAScript अनुरूप इंजन को लागू करता है और ECMA मानक को पूरा करता है।
— स्कॉट मार्कस

0

यह ओवरकिल हो सकता है, लेकिन सादगी के लिए एक मूल वस्तु वह है जो अस्तित्व में है और किसी भी वातावरण में प्रयोग करने योग्य है जो एक ECMAScript अनुरूप इंजन को लागू करता है। यह आमतौर पर एक ब्राउज़र है (लेकिन हमेशा नहीं)।

इसलिए, आपका इंटरनेट एक्सप्लोरर या आपका Google Chrome, उदाहरण के लिए, स्ट्रिंग ऑब्जेक्ट को आपके लिए उपलब्ध नहीं कराता है। स्ट्रिंग ऑब्जेक्ट का उपयोग करने का कारण यह है कि यह जावास्क्रिप्ट भाषा के लिए "देशी" (अंतर्निहित) है।

हालाँकि, यदि आप एक पॉप-अप विंडो बनाना चाहते हैं, तो आपको विंडो ऑब्जेक्ट का उपयोग करना होगा। विंडो ऑब्जेक्ट ब्राउज़र सॉफ़्टवेयर द्वारा ही प्रदान किया जाता है, इसलिए यह जावास्क्रिप्ट का मूल नहीं है, लेकिन यह "ब्राउज़र ऑब्जेक्ट मॉडल" या बीओएम का हिस्सा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.