2013-10-04 2 views
7

इस प्रश्न के लिए के साथ क्या करना उम्मीद होती है नहीं है, मैं कुछ हल करने के लिए एक समाधान की अपेक्षा नहीं कर रहा हूँ, लेकिन चीजों को बेहतर ढंग से समझने के लिए करना चाहते ..एक्स एक समारोह ... क्या आप Object.create एक निर्माता

विनिर्देशों से कुछ उद्धरण:

  • संस्करण 5,1 (Link)

    §15.2.3.5 Object.create (ओ [, गुण])

    01,235,

    निर्माण कार्य एक निर्दिष्ट प्रोटोटाइप के साथ एक नई वस्तु बनाता है। जब निर्माण फ़ंक्शन कहा जाता है, तो निम्न चरणों को लिया जाता है:

    1. यदि टाइप (ओ) ऑब्जेक्ट या नल टाइप टाइपर अपवाद फेंक नहीं है।
    2. ओब्जे को एक नया ऑब्जेक्ट बनाने का नतीजा दें जैसे कि अभिव्यक्ति नया ऑब्जेक्ट() जहां ऑब्जेक्ट उस मानक के साथ मानक अंतर्निर्मित कन्स्ट्रक्टर है
    3. ओ [ओ प्रोटोटाइप]] ओबी की आंतरिक संपत्ति को ओ
    4. यदि तर्क गुण मौजूद हैं और अपरिभाषित नहीं हैं, तो अपने गुणों को ओबीजे में जोड़ें जैसे कि मानक अंतर्निर्मित फ़ंक्शन ऑब्जेक्ट.डेफिनप्रॉपर्टीज को तर्क ओबीजे और गुणों के साथ कॉल करके।
    5. वापसी obj।
  • संस्करण 6 - मसौदा (Link)

    §19.1.3.2 Object.create (ओ [, गुण])

    समारोह बनाने के लिए एक निर्दिष्ट के साथ एक नई वस्तु बनाता है प्रोटोटाइप। जब निर्माण फ़ंक्शन कहा जाता है, तो निम्न चरणों को लिया जाता है:

    1. यदि टाइप (ओ) ऑब्जेक्ट या नल टाइप टाइपर अपवाद फेंक नहीं है।
      1. obj सार आपरेशन का नतीजा हो चलो ObjectCreate तर्क ओ
      2. साथ तर्क गुण, वर्तमान और अपरिभाषित नहीं है तो एक। अमूर्त ऑपरेशन ऑब्जेक्टडिफिनप्रॉपर्टीज (ओबीजे, गुण) का परिणाम लौटाएं।
      3. वापसी obj।

अगर मैं सही ढंग से समझ, चश्मा के दोनों की अनुमति निम्नलिखित कोड निष्पादित करने के लिए:

function F() { 
} 

var x=Object.create(F); 

// a minimal test 
alert(x.prototype.constructor===F); // true 
alert(x instanceof Function) // true 
alert(typeof x) // 'object' 

लगता है यह बनाया गया एक प्रकार का ऑब्जेक्ट से निकला है (गरीब शब्दावली के लिए खेद है ..)Function के रूप में मैं फ़ायर्फ़ॉक्स में परीक्षण किया गया है, और इसलिए xगैर invocable है:

x(); // x is not a function 

मैं क्यों यह या तो नामंज़ूर नहीं है एक निर्माता O के रूप में प्रयोग की जाने वाली या सिर्फ एक वैध बनाने के बारे में सोच रहा हूँ निर्माता।

तो मैं सोच रहा हूं कि आप ऑब्जेक्ट.क्रेट को कन्स्ट्रक्टर के साथ क्या करने की उम्मीद करेंगे?

+3

मैं उम्मीद करता हूं कि 'ऑब्जेक्ट.क्रेट' को अनदेखा करना है कि यह एक कन्स्ट्रक्टर है, क्योंकि एल्गोरिदम को कॉल करने योग्य ऑब्जेक्ट की आवश्यकता नहीं है। चूंकि यह एक साधारण 'ऑब्जेक्ट' देता है, इसलिए मैं यह भी उम्मीद करता हूं कि नतीजा गैर-चालनीय हो। – Zeta

+1

के लिए बाउंटी क्या है? क्या अभी भी बकाया प्रश्न हैं? क्या आप उत्तर अधिक विस्तृत होने के लिए चाहते हैं? – Bergi

+0

दो को समान वोट होने पर स्वीकृत उत्तर के रूप में चिह्नित करने के लिए एक चुनना मुश्किल है। –

उत्तर

4

दुर्भाग्य से यह काम नहीं करेगा। आपके पास एक ऐसा ऑब्जेक्ट है जिसमें इसकी प्रोटोटाइप श्रृंखला में F है; तथ्य यह है कि F एक फ़ंक्शन x फ़ंक्शन नहीं बनाता है।

केवल फ़ंक्शन घोषणा या फ़ंक्शन अभिव्यक्ति के माध्यम से बनाए गए ऑब्जेक्ट्स में "[फ़ंक्शन" उनके [[वर्ग]] और एक [[कॉल]] विधि होगी, जो इसे कॉल करने योग्य बनाता है। वे section 13.2 of the ECMAScript 5 specification पर विस्तृत चरणों के अनुसार बनाए जाते हैं।

Object.create के लिए एल्गोरिदम कुछ अलग करता है, जैसा कि आप अपने उद्धरण पर देख सकते हैं। आपके मामले में, x [[वर्ग]] "ऑब्जेक्ट" और कोई [[कॉल]] विधि के साथ एक नियमित वस्तु होगी। यदि आप Object.prototype.toString.call(x) आज़माते हैं, तो आपको "[object Object]" मिलेगा, जहां "ऑब्जेक्ट" x का [[वर्ग]] है। x instanceof Function केवल true लौटाता है क्योंकि Function कन्स्ट्रक्टर x (F के माध्यम से) की प्रोटोटाइप श्रृंखला का हिस्सा है।

मुझे यकीन नहीं है कि इनमें से कोई भी ईएस 6 में बदला जा रहा है, लेकिन मुझे लगता है कि यह नहीं होगा।

+0

'exampleof' के पास [[वर्ग]] के साथ कुछ भी नहीं है, कृपया उस वाक्य को सही करें। – Bergi

+0

बहुत सच @ बरगी, तय। – bfavaretto

2

तो मैं सोच रहा हूं कि आप ऑब्जेक्ट.क्रेट को कन्स्ट्रक्टर के साथ क्या करने की उम्मीद करेंगे?

मैं इसे निश्चित रूप से कल्पना पालन करने की उम्मीद है ...

मैं क्यों यह या तो एक निर्माता नामंज़ूर नहीं करता है के बारे में सोच रहा हूँ हे के रूप में प्रयोग की जाने वाली

क्यों करना चाहिए यह? प्रत्येक कन्स्ट्रक्टर फ़ंक्शन एक object (§8.6) है।

... या बस एक वैध निर्माता बनाएं।

कल्पना कहते हैं कि यह एक सादे वस्तु जिसका [[प्रोटोटाइप]] ओ सादा वस्तुओं के लिए सेट है कोई कार्य हैं बनाना चाहिए (new Object द्वारा के रूप में),, वे की जरूरत नहीं है एक [[फोन]] या [[निर्माण]] संपत्ति। इसमें [[वर्ग]] Object होगा, Function नहीं होगा।

x.prototype.constructor===F // true 
x instanceof Function // true 
typeof x // 'object' 

यह बनाया गया एक प्रकार का ऑब्जेक्ट, समारोह

F से (गरीब शब्दावली .. के लिए खेद है) से निकला है वास्तव में लगता है।यह संपत्ति F से है (यही कारण है कि आपका पहला परीक्षण true है), और F के माध्यम से यह Function.prototype से भी प्राप्त होता है जो इसे instanceof Function बनाता है। फिर भी, इसमें एक [[कॉल]] संपत्ति नहीं है (यह कॉल करने योग्य नहीं है) इसलिए typeof"function" उत्पन्न नहीं करता है, लेकिन केवल "object" है।

+0

अच्छा बिंदु। मैंने जो सोचा था, उसका कारण यह है कि यह एक काम करने वाला नमूना है और अक्सर बदलता है, क्यों नहीं बनाया जा सकता है कि इसे बनाने के लिए एक असामान्य वस्तु से बचने के लिए या तो अधिक उपयोगी या अधिक सख्त .. –

+1

नहीं, 'Object.create' काफी अच्छी तरह से परिभाषित है और इसके सख्त और न्यूनतर व्यवहार को नहीं बदलेगा। महत्वपूर्ण पिछड़ा-संगतता को संरक्षित करने के लिए, (कन्स्ट्रक्टर) कार्यों के लिए कोई भी "विरासत" समाधान अतिरिक्त शर्तों में अलग-अलग शर्तों के तहत निर्दिष्ट किया जाएगा। – Bergi

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