2015-07-29 5 views
11

मैं जावास्क्रिप्ट से संबंधित लेख/ट्यूटोरियल की एक श्रृंखला लिखना चाहता हूं। जब मैंने this दिलचस्प पैराग्राफ खोजा तो मैं ईसीएमए विनिर्देश को देख रहा था।क्या जावास्क्रिप्ट में विदेशी वस्तुएं हैं?

ECMA-262 के रूप में (6 संस्करण) कहती है:

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

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

नोट से किसी भी वस्तु है कि एक साधारण वस्तु नहीं है एक विदेशी वस्तु है।

अब मैं उत्सुक हूँ। क्या आधुनिक ब्राउज़र की जावास्क्रिप्ट में ऐसी विदेशी वस्तुएं पाई जा रही हैं?

यदि ऐसा है: मुझे एक उदाहरण देता हूँ और कितनी दूर अपने व्यवहार 'साधारण वस्तुओं' से अलग है में बता सकते हैं?

+2

डोम एपीआई मेजबान देश में, 'HTMLElement.dataset.prototype' वस्तु जादू getters और setters, जो साधारण वस्तुओं की तुलना में अलग तरह से व्यवहार किया है। –

+1

[document.all] (https://html.spec.whatwg.org/multipage/obsolete.html#dom-document-all) – Knu

उत्तर

11

एक संभव उदाहरण:

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

से http://www.2ality.com/2015/02/es6-classes-final.html

लिया वहाँ भी एक सूची सरणी, स्ट्रिंग, और इतने पर सहित कल्पना में बाद में है।

वे "विदेशी" रहस्यमय और/या सेक्सी के अर्थ में नहीं कर रहे हैं।

+0

"सामान्य वस्तुओं के पास नहीं होने वाली सुविधाओं" का क्या मतलब है? आखिरकार कुछ अंतर्निहित कोड हैं (उदा: सरणी के लम्बे पटरियों के लिए) जो सामान्य वस्तुओं में हो सकता है। –

+0

@ वंदद * हो सकता है * हां। हालांकि लम्बाई सिर्फ लंबाई को ट्रैक करने से अधिक है। उदा।, Http://stackoverflow.com/a/31550694/438992, और spec से: "एक विदेशी वस्तु वस्तु का कोई भी रूप है जिसका संपत्ति अर्थशास्त्र डिफ़ॉल्ट अर्थशास्त्र से किसी भी तरह से भिन्न होता है।" मुझे लगता है कि लोग "विदेशी" शब्द में बहुत ज्यादा पढ़ रहे हैं। –

+0

मैं अभी 'बाउंड फ़ंक्शन 'के बारे में पढ़ रहा हूं https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind - ये विदेशी ऑब्जेक्ट भी हैं। ब्याज से, क्या हम यह भी कह सकते हैं कि ये वस्तुएं 'उष्णकटिबंधीय' और 'टेम्पलेट' हैं? –

3

ही दस्तावेज़ के Section 9.4 विदेशी वस्तुओं को सूचीबद्ध करता है। उदाहरण के लिए एक सरणी ऐसी वस्तु है। अन्य चीजों के अलावा, यह [[DefineOwnProperty]] आंतरिक विधि वस्तुओं के लिए परिभाषित मानक विधि से अलग है जिसमें यह संख्यात्मक "कुंजी" को अलग-अलग व्यवहार करता है।

+2

बिना किसी टिप्पणी के -1 के बिंदु क्या है? – Amit

+0

और उस खंड में प्रकारों का एक अवलोकन देने के लिए, निम्नलिखित विदेशी ऑब्जेक्ट प्रकार पहचाने जाते हैं: बाध्य कार्य, सरणी, स्ट्रिंग, तर्क, पूर्णांक अनुक्रमित (स्पष्ट रूप से सरणी बफर से संबंधित), मॉड्यूल नेमस्पेस, और प्रॉक्सी। एक लंबा सारांश यहां है: https: //www.quora।कॉम/क्या-कुछ उदाहरण हैं- ES6-जावास्क्रिप्ट-विदेशी-ऑब्जेक्ट्स –

1

डोम सरणियों सरणी

बनाम आप एक ब्राउज़र document.getElementsByTagName('*') परिणाम किसी सरणी सभी डोम आपकी क्वेरी से मेल तत्वों से युक्त वस्तु होने के लिए लग रहा है में कोशिश करता है, तो। लेकिन उस ऐरे पर आप अधिकांश ऐरे कार्यक्षमता को कॉल नहीं कर सकते क्योंकि यह वास्तव में एक ऐरे नहीं है।

यहाँ एक उदाहरण है:

var normalArray = [{objectId: 1}, {objectId: 2}, {objectId: 3}, {objectId: 4}]; 
 
var domArray = document.getElementsByTagName('*'); 
 

 
log(normalArray.length + ' objects in normalArray'); 
 
log(domArray.length + ' objects in domArray'); 
 
printArray(normalArray); 
 
printArray(domArray); 
 

 
function printArray(array){ 
 
    // lets try with array 
 
    try{ 
 
    log('printing normalArray'); 
 
    array.forEach(function(data, index){ 
 
     log('Iteration on ' + index + ' ok', 'success'); 
 
    }); 
 
    }catch(e){ 
 
    log('failed because of ' + e, 'error'); 
 
    } 
 
} 
 

 
function log(msg, className){ 
 
    var logEl = document.createElement('pre'); 
 
    logEl.innerText = msg; 
 
    logEl.className = className || ''; 
 
    document.getElementById('logs').appendChild(logEl); 
 
}
pre{ 
 
    background: #eee; 
 
    padding: 3px; 
 
    margin: 1px; 
 
    border-radius: 3px; 
 
} 
 

 
pre.error{ 
 
    background: #fdd; 
 
} 
 

 
pre.success{ 
 
    background: #dfd; 
 
}
<!DOCTYPE html> 
 
<html> 
 
\t <head> 
 
\t \t <meta charset="utf-8"> 
 
\t \t <title>some test</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <h1>title</h1> 
 
\t \t <p> 
 
\t \t \t Some texts with some <a href="#">links</a> 
 
\t \t </p> 
 
     
 
     <div id="logs"></div> 
 
\t </body> 
 
</html>

+0

इस स्निपेट में क्या बिंदु है? क्या आप यह कहने की कोशिश कर रहे हैं कि 'domArray' विदेशी है क्योंकि इसमें' forEach' फ़ंक्शन परिभाषित नहीं है? (संकेत: यह सामान्य वस्तुओं के लिए "आवश्यकता" नहीं है) – Amit

+2

'getElementsByTagName' और इसी तरह की विधियां एक 'नोडलिस्ट' लौटाती हैं, न कि ऐरे। – Lesleh

+0

मुझे लगता है कि परिभाषा मुझे लगता है, क्या हम 'आवश्यक आंतरिक विधियों' को परिभाषित कर सकते हैं, तो मैं भी जानना चाहता हूं। – zeachco

संबंधित मुद्दे