2011-08-08 16 views
9

स्पष्टीकरण:
"जावास्क्रिप्ट कन्स्ट्रक्टर" को "जावास्क्रिप्ट कन्स्ट्रक्टर" के रूप में और अधिक उचित ढंग से लिखा जाना चाहिए ताकि यह माना जा सके कि रचनाकारों को केवल मूल जावास्क्रिप्ट भाषा रचनाकार नहीं हैं, जैसे वस्तु, ऐरे, फ़ंक्शन इत्यादि, बल्कि अन्य, जावास्क्रिप्ट भाषा परिभाषा के लिए बाह्य लेकिन एक ब्राउज़र के लिए आंतरिक, जैसे कि XMLHttpRequest, शब्द "जावास्क्रिप्ट" यह इंगित करने के लिए है कि इन रचनाकारों को जावास्क्रिप्ट का उपयोग करके व्यक्त और एक्सेस किया गया है।कुछ जावास्क्रिप्ट कन्स्ट्रक्टर क्यों काम नहीं कर रहे हैं?

कुछ संदर्भों:

Rhetorically, वहाँ कार्यों निर्माता के लिए, लेकिन नहीं वस्तुओं निर्माता संदर्भ हैं!

(परिहासपूर्वक, इस वजह से वस्तुओं कार्य हैं, और कार्य वस्तुओं रहे हैं!
Why in JavaScript is a function considered both a constructor and an object?
अधिक विशेष रूप से, वस्तुओं, या कि obj-अंडे ?,, शाब्दिक उदाहरणों अनदेखी कर रहे हैं, कार्यों और कार्यों का instantiations वस्तु हैं कार्य के उदाहरण। यह विवादास्पद है के रूप में तथ्य यह है इसका सबूत है कि कार्यों की वस्तुओं के अस्तित्व के लिए मौलिक हैं
7. Functions
      से पहले आती है
8. Working with Objects
एमडीएन दस्तावेज़ JavaScript Guide में। यही कारण है कि धारा 8, मुझे आपत्ति है !,) विवरण निर्माणकर्ता और समारोह instantiations का उपयोग कर वस्तुओं बनाने के लिए आवश्यक!

क्यों कि डोम इंटरफेस कार्यों नहीं निर्माता ये हैं प्रदान करता है?

javascript: 
    alert([ 
    "using browser environment: \n"+window.navigator.userAgent, 
    Option, Image, Audio, 
     Storage, XMLHttpRequest, Worker, FileReader, 
    ] . join("\n\n")); 

हमें पता चलता है:

ब्राउज़र वातावरण का उपयोग:
Mozilla/5.0 (X11, यू, लिनक्स i686; en-US; आर.वी.: 1.9.2.3) छिपकली/20,100,423 Ubuntu/10.04 (ल्यूसिड) फ़ायरफ़ॉक्स/3.6।3

[वस्तु ऑप्शन]

[वस्तु छवि]

[वस्तु ऑडियो]

[वस्तु संग्रहण]

[वस्तु XMLHttpRequest]

[वस्तु कार्यकर्ता]

[ऑब्जेक्ट फ़ाइल रीडर]

लेकिन ...

javascript: 
    alert([ 
      XPCNativeWrapper, 
    ].join("\n\n")); 

(जो

समारोह XPCNativeWrapper पैदा करता है() { [मूल कोड]}

)

और जावास्क्रिप्ट भाषा constructors कार्य हैं। ब्राउज़र वातावरण का उपयोग

:

javascript: 
    alert([ 
    "using browser environment: \n"+window.navigator.userAgent, 
      Array, Boolean, Date, Function, 
       Number, Object, RegExp, String, 
       Error, Iterator, 
    ].join("\n\n")); 

हमें देता है
Mozilla/5.0 (; यू, लिनक्स i686; X11 en-US; आर.वी.: 1.9.2.3) छिपकली/20,100,423 Ubuntu/10.04 (ल्यूसिड) फ़ायरफ़ॉक्स/3.6।3

समारोह सरणी() { [मूल कोड]}

समारोह बूलियन() { [मूल कोड]}

समारोह की तारीख() { [मूल कोड]}

समारोह समारोह() { [मूल कोड]}

समारोह संख्या() { [मूल कोड]}

+०१२३५१६४१०६

समारोह वस्तु() { [मूल कोड]}

समारोह RegExp() { [मूल कोड]}

समारोह स्ट्रिंग() { [मूल कोड]}

समारोह त्रुटि() { [मूल कोड]}

समारोह इटरेटर() { [मूल कोड]}

+0

' समारोह वस्तु() के दायरे से परे {[मूल कोड]} 'स्पष्ट रूप से वस्तु एक समारोह है। (मेरी जीभ मेरे गाल में है और मैं गालिया हूं, लेकिन, – Ekim

+0

यहां कुछ ऑब्जेक्ट ऑब्जेक्ट्स हैं जो कार्य हैं: 'जावास्क्रिप्ट: x = y = z = ऑब्जेक्ट; चेतावनी ([x, y, z] .join ("\ n \ n")) ' दोहराना, प्रत्येक ऑब्जेक्ट एक फ़ंक्शन है! (इतना ऑब्जेक्ट नहीं!) – Ekim

उत्तर

4

पहले:

वस्तुओं कार्य हैं

नहीं, तो The नहीं हैं:

> a = function() {} 
    function() {} 
> a instanceof Object 
    true 
> b = {} 
    Object 
> b instanceof Function 
    false 

toString विधि (जो कहा जाता हो जाता है क्या जब आप स्ट्रिंग करना है concatenation) किसी ऑब्जेक्ट के बारे में जानकारी प्राप्त करने का एक विश्वसनीय तरीका नहीं है। अगर मैं typeof उपयोग करते हैं, मैं निम्नलिखित मिल:

using browser environment: 
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:5.0.1) Gecko/20100101 Firefox/5.0.1 

function 

function 

function 

object 

function 

function 

function 

तो आप देखते हैं, उनमें से ज्यादातर के अलावा प्रपत्र Storage, वास्तव में काम करता है (कारण है कि यह Storage लिए काम नहीं करता, मैं नहीं जानता कि) कर रहे हैं।

यह भी ध्यान रखें कि डोम इंटरफ़ेस मूल जावास्क्रिप्ट ऑब्जेक्ट्स से अलग व्यवहार कर सकता है।

दूसरी ओर, क्रोम में toString विधि इस देता है:

[object Function] 

[object Function] 

[object Function] 

function Storage() { [native code] } 

function XMLHttpRequest() { [native code] } 

function Worker() { [native code] } 

function FileReader() { [native code] } 
+1

'टाइपोफ स्टोरेज ===" फंक्शन "' क्रोम 12 – Raynos

+0

@ रेयोनोस में: मैंने अभी भी यह देखा है ... –

+0

कथन "ऑब्जेक्ट्स फ़ंक्शन हैं!" चतुर के रूप में योग्यता प्राप्त की गई थी - लेकिन ... ऑब्जेक्ट्स फंक्शन इंस्टेंटेशन हैं! कार्यों के बिना कोई तात्कालिकता नहीं है, और बिना किसी तात्कालिकता के, 'new' के माध्यम से, कोई वस्तु नहीं है! ('{property1: value1, property2: value2} 'और पूर्वनिर्धारित इकाइयों जैसे अक्षरों को छोड़कर) – Ekim

1

आप उन मूल्यों ब्राउज़र इंजन value.toString() चेतावनी है तो हम क्यों एक अजीब ढंग से Function.prototype.toString व्यवहार करता है के बारे में बात कर रहे हैं तो सूचना ।

ES5.1 विनिर्देश राज्यों:

15.3.4.2 Function.prototype.toString() समारोह का एक कार्यान्वयन पर निर्भर प्रतिनिधित्व दिया जाता है। इस प्रतिनिधित्व में फ़ंक्शनक्शनक्लेक्शन का सिंटैक्स है।

विशेष रूप से ध्यान दें कि प्रतिनिधित्व के भीतर सफेद अंतरिक्ष, लाइन टर्मिनेटर, और सेमीकॉलन का उपयोग और प्लेसमेंट कार्यान्वयन-निर्भर है।

ToString फ़ंक्शन सामान्य नहीं है; यह TypeError अपवाद फेंकता है यदि यह मान फ़ंक्शन ऑब्जेक्ट नहीं है। इसलिए, इसे विधि के रूप में उपयोग के लिए अन्य प्रकार की वस्तुओं में स्थानांतरित नहीं किया जा सकता है।

स्पष्ट रूप से ES5 बताता है कि toString कार्यान्वयन विशिष्ट स्ट्रिंग देता है।

आप ES Harmony proposals पृष्ठ को पढ़ने अगर यह कहता है:

स्ट्रिंग के लिए समारोह - समस्याग्रस्त Function.prototype.toString के लिए अधिक से अधिक विनिर्देश (markm, एलन)

यहां कुछ और संसाधन हैं:

मूल रूप से यह एक ज्ञात मुद्दा है कि toString समारोह वस्तुओं पर (और विशेष रूप ऑब्जेक्ट भी कार्य हैं की मेजबानी) अपरिभाषित व्यवहार है। टीसी 3 9 समिति पहले से ही इसे मानकीकृत करने पर काम कर रही है।

जैसा कि आप देख सकते हैं कि मेजबान वस्तुओं को स्ट्रॉमैन में मानकीकृत करने का प्रस्ताव है, इसलिए यह हवा में है चाहे वह ES6 में हो। हालांकि ईसीएमए भूमि में रहने वाली कार्यस्थलों में सद्भाव प्रस्ताव पृष्ठ पर परिभाषित ईएस 6 में मानकीकृत toString विधि होनी चाहिए।

+0

"15.3.4.2 फ़ंक्शन.प्रोटोटाइप.टोस्ट्रिंग () एक कार्यान्वयन-निर्भर प्रतिनिधित्व ... एक समारोह घोषणा का वाक्यविन्यास है।" क्रोम का 'फ़ंक्शन वर्कर() {[मूल कोड]}' योग्यता प्राप्त करता है लेकिन '[ऑब्जेक्ट वर्कर]' – Ekim

+0

नहीं है ... क्यों' छवि', 'विकल्प' आदि अनुरूप नहीं है? वे क्यों हैं "ज्ञात मुद्दे"? – Ekim

+0

@ekim फिर से होस्ट ऑब्जेक्ट्स (ब्राउज़र और डीओएम का हिस्सा) और ईएस ऑब्जेक्ट्स के बीच विचलित हो जाएं। होस्ट ऑब्जेक्ट्स जो भी वे कृपया कर सकते हैं क्योंकि वे होस्ट ऑब्जेक्ट्स हैं। वे गैर-मानक हैं जितना आप प्राप्त कर सकते हैं। – Raynos

1

सवाल वास्तव में के रूप में दूसरे शब्दों में बयान किया जा सकता है:

"? क्या जावास्क्रिप्ट (ECMAScript) भाषा सम्मेलनों में इस तरह के प्रोग्रामिंग वस्तुओं है कि डोम इंटरफेस के रूप में करने के लिए लागू करते हैं और ब्राउज़र के अन्य घटकों के अर्हता प्राप्त"

मूल प्रश्न उन वस्तुओं का उपयोग करता है जो माना जाता है कि फ़ंक्शन का प्रकार है और कन्स्ट्रक्टर के रूप में उपयोग किया जाता है। उदाहरण दिखाते हैं कि प्रोग्रामिंग पर्यावरण और डीओएम इंटरफ़ेस के साथ एक डिकोटॉमी मौजूद है, जिसमें उनका प्रतिनिधित्व किया जाता है।

यदि यह वास्तविक डिकोटॉमी है, तो क्या यह स्पष्ट किया गया है?

यह वास्तविक समस्या हो सकती है। यदि ऐसा है, तो वास्तविक समस्या पर ध्यान देने के लिए मूल प्रश्न इस से पहले किया जाना चाहिए।

संदर्भ:

ECMAScript भाषा constructor विवरण:

  • 4.3.4 constructor
  • 13.2.2 [[Construct]]
  • 15.3.4.5.2 [[Construct]]

  • के हवाले से अनुभाग "हर निर्मित निर्माता समारोह प्रोटोटाइप वस्तु है" 15 Standard Built-in ECMAScript Objects
  • "ऐसी उम्मीद है कि एक ECMAScript कार्यक्रम प्रदान करेगा कम्प्यूटेशनल पर्यावरण ... कुछ वातावरण-विशिष्ट मेजबान वस्तुओं, जिसका विवरण और व्यवहार इस विनिर्देश "
    के हवाले से अनुभाग 4 Overview
संबंधित मुद्दे