मैं जावास्क्रिप्ट के लिए नया हूं, इसलिए क्षमा करें यदि इसका एक छोटा सा उत्तर है।

ईसीएमएस्क्रिप्ट भाषा विनिर्देश के अनुसार, यदि वैल का रिटर्न प्रकार Object (implements [[Call]]) है तो परिणाम स्ट्रिंग "फ़ंक्शन" है। मुझे समझ में नहीं आता कि निम्नलिखित कोड में, नव निर्मित वस्तु का प्रकार "फ़ंक्शन" क्यों नहीं है:

function FunctionCreator(){}

FunctionCreator.prototype = Function.prototype;

let obj = new FunctionCreator();

console.log(typeof obj); // object
console.log(obj.call); // ƒ call() { [native code] }

[[कॉल]] विधि को Function.prototype में परिभाषित किया गया है, वैसे ही मेरा मानना ​​​​है कि इसे सामान्य फ़ंक्शन के लिए परिभाषित किया गया है, और फिर भी टाइपऑफ ऑब्जेक्ट देता है।

1
i8pi 18 जून 2020, 20:01

1 उत्तर

सबसे बढ़िया उत्तर

obj एक फ़ंक्शन नहीं है, यह new ऑपरेटर के माध्यम से बनाई गई एक वस्तु है। FunctionCreator एक फ़ंक्शन है, लेकिन यह फ़ंक्शन नहीं बनाता है। बस इसका प्रोटोटाइप Function.prototype बनाने से वह कार्य नहीं करता है जो वह बनाता है, यह केवल ऑब्जेक्ट को उन गुणों को विरासत में देता है जिनका उपयोग उपयोगी नहीं किया जा सकता है, क्योंकि यह एक फ़ंक्शन नहीं है।

[[कॉल]] विधि Function.prototype में परिभाषित है...

हो सकता है कि आप यही गलत समझ रहे हों। Function.prototype में एक call तरीका है, लेकिन यह [[Call]] आंतरिक विधि नहीं है। यह केवल call नामक एक विधि है। [[कॉल]] बाहरी रूप से पहुंच योग्य नहीं है (और जावास्क्रिप्ट इंजन के कार्यान्वयन के आधार पर, यह सचमुच मौजूद नहीं हो सकता है; यह एक विनिर्देश तंत्र है)।

फ़ंक्शन बनाने के लिए, आप फ़ंक्शन घोषणा, फ़ंक्शन अभिव्यक्ति, विधि परिभाषा आदि का उपयोग करते हैं। (यहां और अधिक); या यदि आप उनसे बच नहीं सकते हैं और आप उनसे जुड़े खतरों को जानते हैं, eval या new Function

1
T.J. Crowder 18 जून 2020, 17:07