2016-01-15 5 views
11
> Function.call == Function.prototype.call 
true 
> Function.prototype == Function 
false 

Function.prototype.* विधियां Function.* के रूप में क्यों मौजूद हैं? यह असंगत लगता है।हमारे पास जावास्क्रिप्ट में Function.call क्यों है?

यह किसी अन्य प्राथमिक प्रकार के मामले में नहीं है (Array.slice मौजूद नहीं है लेकिन Array.prototype.slice करता है)।

उत्तर

18

क्योंकि Function ही Function

console.log(Function instanceof Function); 
console.log(Object.getPrototypeOf(Function) === Function.prototype); 

तो के प्रोटोटाइप है, Function रों प्रोटोटाइप में सभी कार्यों Function भी में उपलब्ध हैं।

the specification का हवाला देते हुए,

समारोह प्रोटोटाइप वस्तु अपने आप में एक समारोह वस्तु है (अपने [[क्लास]] है "फंक्शन")


एक और तरीका है इस बात की पुष्टि करने के लिए इस होगा ,

console.log(Function.call === Function.prototype.call); 

इसका मतलब है कि Function.call ऑब्जेक्ट और Function.prototype.call ऑब्जेक्ट समान हैं।

console.log(Function.hasOwnProperty('call')); 

इसका मतलब है कि Function वस्तु ही call संपत्ति नहीं है।

console.log(Function.prototype.hasOwnProperty('call')); 

इसका मतलब है कि Function.prototype वस्तु call संपत्ति है।


Array.slice मौजूद नहीं है लेकिन Array.prototype.slice कर

क्योंकि Array समारोह के प्रोटोटाइप Function वस्तु, नहीं Array वस्तु है।

console.log(Object.getPrototypeOf(Array) === Function.prototype); 

यही कारण है कि हम Array समारोह पर call, apply, bind आदि मिलता है। यह Array ऑब्जेक्ट Array का प्रोटोटाइप रहा था, तो sliceArray ऑब्जेक्ट पर भी उपलब्ध होगा।

+0

हाँ। समारोह एक कन्स्ट्रक्टर है। 'Array.call === Function.call'। – Louy

+0

यह जावा "कक्षा" कक्षा के समान है? – valepu

+1

@ valepu तरह, हाँ। यदि जावास्क्रिप्ट एक वर्ग-आधारित भाषा था तो हम कहेंगे कि 'फंक्शन' 'फंक्शन' का एक उदाहरण है, लेकिन जावा 'कक्षा' में * कक्षा 'का उदाहरण नहीं है (क्योंकि कक्षाएं 'कक्षा' के उदाहरण नहीं हैं, या सामान्य रूप से, कुछ भी)। 'क्लास' में अभी भी एक अजीब रिकर्सन चीज चल रही है, क्योंकि इसमें 'क्लास' और 'क्लास.क्लास == क्लास.क्लास.get क्लास() 'टाइप क्लास ऑब्जेक्ट है। – immibis

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