लगता है कि आपने पहलू उन्मुख प्रोग्रामिंग यहां किसी तरह का क्या करना चाहते हैं ....
जावास्क्रिप्ट, एक ECMAScript बोली के रूप में, एक प्रतिदेय वस्तु की धारणा है। प्रत्येक कॉल करने योग्य ऑब्जेक्ट में आंतरिक संपत्ति है जिसे [[Call]]
कहा जाता है। इस संपत्ति का वर्णन ईसीएमए -262 विशिष्टता, 5 वां संस्करण की धारा 8.6.2, तालिका 9 में किया गया है। यह कहता है:
ऑब्जेक्ट से जुड़े कोड निष्पादित करता है। फ़ंक्शन कॉल अभिव्यक्ति के माध्यम से आमंत्रित किया गया। SpecOp के लिए तर्क इस ऑब्जेक्ट और फ़ंक्शन कॉल अभिव्यक्ति को दिए गए तर्क वाले एक सूची हैं। इस आंतरिक विधि को लागू करने वाले ऑब्जेक्ट्स कॉल करने योग्य हैं। होस्ट ऑब्जेक्ट्स केवल कॉल करने योग्य ऑब्जेक्ट्स संदर्भ मान वापस कर सकते हैं।
एक आंतरिक संपत्ति कोई नाम नहीं है और ECMAScript भाषा ऑपरेटरों के माध्यम से सीधे सुलभ नहीं है:
लेकिन के बारे में पता होना करने के लिए बात यह है कि [[Call]]
एक आंतरिक संपत्ति है, जिसके लिए कल्पना का कहना है। विनिर्देश उद्देश्यों के लिए आंतरिक गुण पूरी तरह मौजूद हैं।
तो आप इस तंत्र में अपने स्वयं के जावास्क्रिप्ट कोड में शामिल नहीं हो सकते हैं।
अब दो तरीकों Function.prototype
, apply
और call
में परिभाषित कर रहे हैं। यह सच है कि यदि आप Function.prototype.call
की परिभाषा को बदलते हैं तो यदि आप अपना स्वयं का फ़ंक्शन f
बनाते हैं, तो f.call
वास्तव में (जब तक एफ के प्रोटोटाइप में या एफ में स्वयं ओवरराइड नहीं किया जाता है) उस कोड को निष्पादित करता है। जैसा कि आपने माना है, यह f
पर कॉल करके स्वचालित रूप से नहीं होगा। आपको call
विधि को स्पष्ट रूप से कॉल करना होगा।
सभी ने कहा कि, अंतर्निहित वस्तुओं के प्रोटोटाइप में पूर्वनिर्धारित, मानक विधियों के साथ मिलना सबसे अच्छा नहीं है। पुस्तकालयों और अनुप्रयोगों में बहुत से मौजूदा कोड Function.prototype.call
पर निर्भर करते हैं। इसके साथ गड़बड़ मत करो। आप निश्चित रूप से कई तरीकों से एओपी व्यवहार को लागू कर सकते हैं। एक को Function.prototype
कुछ अन्य विधि, में जोड़ना है, लेकिन इसे न करें। एक और हुक के पहले और बाद में अपनी कॉल विधि लिखना है:
function call(theThis, before, main, after, beforeArgs, mainArgs, afterArgs) {
before.apply(theThis, beforeArgs);
main.apply(theThis, mainArgs);
after.apply(theThis. afterArgs);
}
क्या आप 'Function.call' के बारे में सोच रहे हैं? 'Object.prototype' पर कोई विधि 'कॉल' नहीं है। –
शायद आप समझा सकते हैं कि आप वास्तव में क्या करने की कोशिश कर रहे हैं। मुझे नहीं लगता कि आप जावास्क्रिप्ट स्तर पर प्रत्येक जावास्क्रिप्ट फ़ंक्शन कॉल को रोक सकते हैं।ऐसा करने के लिए आपको शायद जेएस इंजन के अंदर कुछ हुक तक पहुंच होनी पड़ेगी। – jfriend00