2012-05-01 14 views
6

मैं नवीनतम ECMA-262 संदर्भ पढ़ रहा हूँ, संस्करण 5.1 जून 2011क्या एक निर्माता हमेशा एक कार्य वस्तु है?

खंड में 8.6.2 तालिका 9 हम के संबंध में है [[निर्माण]] आंतरिक संपत्ति:

एक वस्तु बनाता है । नए ऑपरेटर के माध्यम से आमंत्रित किया गया। SpecOp के लिए तर्क नए ऑपरेटर को दिए गए तर्क हैं। इस आंतरिक विधि को लागू करने वाले ऑब्जेक्ट को कन्स्ट्रक्टर कहा जाता है।

मानक यह नहीं कहता कि एक निर्माता को फ़ंक्शन ऑब्जेक्ट होना चाहिए। तो क्या हमारे पास एक कन्स्ट्रक्टर ऑब्जेक्ट हो सकता है जो फ़ंक्शन ऑब्जेक्ट नहीं है?

Link to the standard as requested

+0

क्या आप spec दस्तावेज़ से लिंक कर सकते हैं? मुझे नहीं लगता कि बहुत से लोग आपके द्वारा प्रदान किए गए उद्धरण के लिए पूर्ण संदर्भ के बिना उत्तर देने में सक्षम होंगे। (दिलचस्प सवाल, यद्यपि!) – apsillers

+2

आपको [एनोटेटेड ES5] (http://es5.github.com/) में रुचि हो सकती है जो ईसीएमए -262 5.1 मानकों पीडीएफ का एक HTML रूपांतरण है। इसमें सेक्शन एंकर हैं [धारा 8.6.2] (http://es5.github.com/#x8.6.2) के लिए। –

+0

अगर मुझे सही याद है, तो क्रॉकफोर्ड ने कहा कि सामान्य रूप से, एक कन्स्ट्रक्टर का उपयोग करना जेएस – thepoosh

उत्तर

3

जबकि "कन्स्ट्रक्टर" शब्द परिभाषित किया गया है (जैसे @RobG pointed out), ऐसा कुछ भी नहीं है जो गैर-"कन्स्ट्रक्टर" ऑब्जेक्ट को [[Construct]] विधि से रोकता है।

यह थोड़ा उलझन में है। इसका मतलब है कि आप new ऑपरेटर का उपयोग उस ऑब्जेक्ट पर कर सकते हैं जो Function नहीं है (इस प्रकार 4.3.4 के अनुसार "कन्स्ट्रक्टर" नहीं है), लेकिन वास्तव में [[Construct]] विधि प्रदान करता है।

ध्यान दें कि मानक वस्तुओं में से कोई भी इसके लिए अर्हता प्राप्त नहीं करता है, लेकिन host objects वास्तव में हो सकता है। जैसे कि जावा एक ब्राउज़र प्लगइन तो जैसे कुछ वस्तु का पर्दाफाश हो सकता है:

new java.lang.String(); // it works, so java.lang.String has a [[Construct]] method 
java.lang.String instanceof Function // false 
Object.prototype.toString.call(java.lang.String).indexOf('Function') // -1 

ध्यान दें कि typeof java.lang.String रिटर्न भी java.lang.String हालांकि "function" एक समारोह नहीं है। यह 11.4.3 के अनुसार सही है

+0

अगला आप "फ़ंक्शन क्या है?" के अर्थशास्त्र में खो जाएंगे। इस स्पेक में केवल मूल वस्तुओं (अंतर्निर्मित समेत) शामिल हैं और स्पष्ट रूप से होस्ट ऑब्जेक्ट्स को अपनी पसंद के अनुसार करने की अनुमति देता है। यह ईसीएमए -262 का पालन करने के लिए मेजबान वस्तुओं के रचनाकारों के लिए समझ में आता है, लेकिन ऐसे कई मामले हैं जहां वे नहीं हैं, उदाहरण के लिए अच्छा है कि आईई नहीं है। :-) – RobG

+0

@RobG यह सुनिश्चित नहीं है कि आप यहां क्या कहने की कोशिश कर रहे हैं। [8.6.2] (http://es5.github.com/#x8.6.2) होस्ट ऑब्जेक्ट्स को कुछ हद तक कवर करता है। साथ ही, "फ़ंक्शन" शब्द को परिभाषित किया गया है [4.3.24] (http://es5.github.com/#x4.3.24) – user123444555621

+0

@RobG मुझे लगता है कि समस्या यह है कि कल्पना पूरी तरह से संगत नहीं है। – Roland

4

जवाब अत्यंत सरल है। ES5 § 4.3.4 का कहना है:

Constructor Function object that creates and initialises objects.

तो वहाँ तुम्हारे पास है, परिभाषा के द्वारा केवल एक समारोह एक निर्माता हो सकता है। हालांकि, संभवतः मेजबान ऑब्जेक्ट्स हैं जो रचनाकारों की तरह व्यवहार करती हैं जिनमें मूल फ़ंक्शन ऑब्जेक्ट्स के अन्य गुण नहीं हैं (उदाहरण के लिए IE में मूल XMLHttpRequest ऑब्जेक्ट जो ActiveX में लागू किया गया था)।

+0

के बीच एक बड़ा अंतर है, मैं इसे उत्तर के रूप में स्वीकार कर रहा हूं। IMHO spec पूरी तरह से स्पष्ट नहीं है कि ऐसा लगता है कि एक ऑब्जेक्ट जो फ़ंक्शन नहीं है, अभी भी [[निर्माण]] आंतरिक संपत्ति हो सकती है, कम से कम तालिका 9 में संदर्भित तालिका 9 इसे स्पष्ट रूप से प्रतिबंधित नहीं करती है। अगर कोई जानता है कि spec का लेखक कौन है तो मैं उसे एक ईमेल लिखना चाहता हूं और स्पष्टीकरण मांगना चाहता हूं। – Roland

0

Pumbaa80 के answer में जोड़ने के लिए (यह एक [[Call]] विधि के साथ एक मेजबान वस्तु है) (यह एक टिप्पणी के लिए बहुत लंबा हो जाएगा)।

भ्रम जिसके अनुसार जब एक समारोह केconstruct निष्पादित किया जाता है इसके call आपरेशन निष्पादित करने के लिए किया गया है (लेकिन यह कहना नहीं है क्या जब एक वस्तु का construct कि नहीं है किया जा सकता है 13.2.2 की वृद्धि हुई है एक समारोह निष्पादित किया जाता है)। अब, call लागू करने वाली ऑब्जेक्ट 9.11 के अनुसार कॉल करने योग्य फ़ंक्शन ऑब्जेक्ट्स हैं।

4.2 के अनुसार "एक फ़ंक्शन एक कॉल करने योग्य ऑब्जेक्ट" है। लेकिन निश्चित रूप से यह इस बात का तात्पर्य नहीं है कि प्रत्येक कॉल करने योग्य वस्तु एक कार्य है।

तो अगर मुझे यह सही मिला तो गैर फ़ंक्शन ऑब्जेक्ट्स में Construct विधि हो सकती है और Call विधि भी हो सकती है। java.lang.String ऐसा एक उदाहरण होगा।

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