2010-01-04 13 views
13
Object instanceof Object 
true 
Object instanceof Function 
true 
Function instanceof Object 
true 
Function instanceof Function 
true 

इसलिए यदि समारोह एक वस्तु है काफी भ्रमित कर रहे हैं और वस्तु एक समारोह कैसे आवस्तु और समारोह

Function === Object और Function == Object झूठे हैं है?

मुझे समझ में आता है कि किसी ऑब्जेक्ट का उदाहरण जांचना तुलना के समान नहीं है। तो यहां सवाल यह है कि मामले में अस्पष्टता है, जहां दो वस्तुओं (जो वास्तव में प्रकार हैं) एक-दूसरे के उदाहरण हैं, तो क्या प्रकार समान नहीं होना चाहिए?

नोट: ऑब्जेक्ट केवल संख्या या एक ऐरे का उदाहरण नहीं है जो फ़ंक्शन का एक उदाहरण है।

उत्तर

17
JavaScript Prototypal Inheritance से

:

काफी सब कुछ, जावास्क्रिप्ट में, वस्तु से विरासत। हम कह सकते हैं कि ऑब्जेक्ट सुपर क्लास, या बेहतर, सुपर कन्स्ट्रक्टर है, प्रत्येक चर और यह सब कुछ ऑब्जेक्ट का उदाहरण है। ऑब्जेक्ट कन्स्ट्रक्टर एक फंक्शन है, लेकिन एक फंक्शन ऑब्जेक्ट का एक उदाहरण है। इसका मतलब यह है कि इन दावों को हमेशा सच हैं:

(Object instanceof Function) === (Function instanceof Object)

उदाहरण से ऊपर सच है क्योंकि वस्तु एक निर्माता है, और जावास्क्रिप्ट में एक निर्माता हमेशा एक समारोह है। उसी समय पर, प्रत्येक फ़ंक्शन का अपना प्रोटोटाइप होता है, और एक प्रोटोटाइप हमेशा ऑब्जेक्ट.प्रोटोटाइप से अपनी विरासत शुरू करता है। फंक्शन कन्स्ट्रक्टर, एक फ़ंक्शन स्वयं है, और फ़ंक्शन प्रोटोटाइप फ़ंक्शन() {} है;

(Function.prototype instanceof Object) === (function(){} instanceof Object)

+1

+1 वही बात कहने के लिए जो मैंने कहा लेकिन एक बहुत अधिक संक्षिप्त और समझने योग्य तरीके से। एक्सडी –

+0

हां, महान स्पष्टीकरण! – Graza

+0

'सबकुछ, जावास्क्रिप्ट में, ऑब्जेक्ट से विरासत में मिलता है और फिर ES5 आया: 'var notObject = Object.create (null); ऑब्जेक्ट का ऑब्जेक्ट उदाहरण नहीं; // false' –

-2

उदाहरण ऑपरेटर इंगित करता है कि पहला तर्क दिए गए प्रकार का है या नहीं। यही कारण है कि

A instanceof B 

रिटर्न सच कह रहा है, तो एक प्रकार बी

== और का एक उदाहरण है === ऑपरेटरों दूसरी ओर तुलना ऑपरेटर हैं। वे समानता के मूल्यों की तुलना करते हैं।

उदाहरण के लिए, आप जैक उदाहरण कह सकते हैं कि लड़का सच है लेकिन क्या आप जैक == लड़का कहेंगे? सं।

+0

ओपी का प्रश्न इस बात के बारे में अधिक है कि 'ऑब्जेक्ट' और 'फंक्शन' एक दूसरे के उदाहरण कैसे हो सकते हैं और एक ही बात नहीं हो सकती है। –

4

मुझे लगता है कि यह अद्वितीय तरीका है जिसके कारण वस्तुओं को परिभाषित किया गया है। आप जावास्क्रिप्ट में एक प्रकार को परिभाषित नहीं करते हैं, आप एक निर्माता को परिभाषित करते हैं। लेकिन आप कन्स्ट्रक्टर को कन्स्ट्रक्टर के रूप में भी परिभाषित नहीं करते हैं, यह बस एक समारोह है।

फिर आप उनके कन्स्ट्रक्टर के नाम से प्रकारों का उल्लेख कर सकते हैं .... जो सिर्फ एक कार्य है।

function Tiger(){ //function, or object? 
} 

function Apple(){ //function, or object? 
} 

दोनों वस्तुओं, या शायद सिर्फ कार्यों हो सकता है। केवल आप जिस तरह से उनका उपयोग करेंगे, वह निर्धारित करेगा। तो यह प्रकार समझ में आता है कि निम्न स्तर पर, वस्तुएं कार्य करती हैं और कार्य वस्तुएं होती हैं, लेकिन अभी भी एक अंतर है, है ना?

+0

आपकी टिप्पणी विधि या वस्तु के संबंध में, यह निश्चित रूप से एक विधि नहीं है जब तक इसे किसी दायरे से नहीं कहा जाता है। – Murali

+0

आह, हाँ, क्या यह एक शब्दावली संघर्ष है - क्या "// फ़ंक्शन, या ऑब्जेक्ट?" एक बेहतर टिप्पणी हो? – Graza

+0

यह आपके लिए तय किया गया है। :) –

5

जावास्क्रिप्ट में सब कुछ Object है क्योंकि जावास्क्रिप्ट एक ऑब्जेक्ट-उन्मुख भाषा है। FunctionObject का एक उदाहरण है क्योंकि सब कुछ Object का उदाहरण है। काफी सरल। हालांकि, ऑब्जेक्ट्स जो अन्य ऑब्जेक्ट्स (कन्स्ट्रक्टर) को प्रारंभ करते हैं, वे भी Function एस जावास्क्रिप्ट में हैं, इसलिए यह Object के लिए Function भी हो जाएगा।

इस बारे में सोचें:

var obj = new Object(); 

Object इस मामले में एक Function के रूप में प्रयोग किया जाता है, है ना? इसलिए, सिद्धांत रूप में, Object भाषा में निम्नतम स्तर की वस्तु होनी चाहिए, जावास्क्रिप्ट Function एस (पन!) के बिना काम नहीं कर सकता है, इसलिए आपको दोनों एक ही स्तर पर होने की आवश्यकता है। Object को Function का एक उदाहरण होने की आवश्यकता है क्योंकि यह एक निर्माता है और इसे स्वयं के अधिक उदाहरण बनाने की आवश्यकता है। क्योंकि यह दोनों है

function FooBar() {} 

ऊपर FooBar वर्ग, Object और Function दोनों का एक उदाहरण है।एक ही तर्क अंतर्निहित Object और Function ऑब्जेक्ट्स पर लागू होता है; वे दोनों के उदाहरण हैं।

पुhew, भ्रमित। वास्तव में उसका कोई मतलब है?

+0

मुझे समझ में आता है, लेकिन जैसा कि आप शायद देख सकते हैं कि मुझे एक ही चीज़ को समझाने की कोशिश करने में उतनी ही परेशानी (असफल) थी :-P – Graza

+0

हाहा हाँ, यह समझाना आसान नहीं है! –

+0

यह निश्चित रूप से समझ में आता है कि यह जावास्क्रिप्ट है, किसी भी अन्य भाषा में जो मुझे पता है कि आप एक फ़ंक्शन (प्रकार का फ़ंक्शन) को तुरंत चालू करते हैं, आप केवल इसे आमंत्रित करते हैं। सही प्रश्न का उत्तर देने की कोशिश में अपने प्रयास की सराहना करें। – Murali

0
javascript:alert([ window.navigator.userAgent, Object ].join("\n\n")) 

प्रदर्शित करता है

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 
    Ubuntu/10.04 (lucid) Firefox/3.6.3 

function Object() { 
    [native code] 
} 

संदर्भ: Is every JavaScript Object a function?

+0

'जावास्क्रिप्ट: चेतावनी (फ़ंक्शन)' डिस्प्ले 'फ़ंक्शन फ़ंक्शन() { [मूल कोड] } ' – Ekim

1

जावास्क्रिप्ट में कक्षाओं के रूप में ऐसी कोई चीज नहीं है। instanceof ऑपरेटर को फ़ंक्शंस पर बुलाया जाता है।

Object "ऑब्जेक्ट वस्तुओं" (हाँ, यह आधिकारिक शब्द है) के लिए एक निर्माता समारोह है, और Function "समारोह वस्तुओं" के लिए निर्माता कार्य है।

इसलिए, जब आप Function instanceof Object कहते हैं, यह true रिटर्न क्योंकि Function, एक समारोह, और इस तरह एक वस्तु, आदि इसका मतलब यह नहीं है कि प्रकार के समान हैं क्योंकि वस्तु और समारोह विभिन्न प्रोटोटाइप है:

Object.prototype 
^
    | inherits from 
    |    instance 
Function.prototype <------- Object, Function 
+0

अच्छी कॉपी और पेस्टिंग आपका आखिरी जवाब –

+0

... चूंकि प्रश्न डुप्लिकेट – user123444555621

+1

के रूप में बंद कर दिया गया था, इसलिए मैंने डुप्लिकेट सामग्री से बचने के लिए अन्य उत्तर हटा दिया :) – user123444555621

0

मान लीजिए:

< ----: (.__proto__ के माध्यम से)

के लिए लिंक

< -:

Function.prototype < ---- {वस्तु, समारोह}

वस्तु: (. के माध्यम से)

फिर की विरासत में मिला संपत्ति है < ---- फंक्शन।प्रोटोटाइप

Object.prototype < - वस्तु

console.log(Object.prototype.constructor === Object); // true! 

Object.prototype कुछ भी करने के लिए नहीं लिंक करता है, इसमें __proto__ संपत्ति नहीं है।

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