2011-09-07 24 views
8

क्या सामान्य स्तर पर "कॉल" फ़ंक्शन को ओवरराइड करना संभव है, ताकि जब भी ऐप में किसी विधि को कहीं भी कॉल किया जाए, तो कुछ होता है।क्या "कॉल" फ़ंक्शन को ओवरराइड करना संभव है?

मैंने ऑब्जेक्ट.call को ओवरराइड करने का प्रयास किया, लेकिन हालांकि मैं इसे करने में कामयाब रहा, लेकिन मेरे ऐप के काम में कुछ भी नहीं बदला।

बीटीडब्ल्यू, भले ही यह काम करता है, क्या मुझे स्पष्ट रूप से "foo.call (यह, args)" कॉल करना चाहिए, या सामान्य फ़ंक्शन कॉल "foo (args)" भी काम करेगा?

+0

क्या आप 'Function.call' के बारे में सोच रहे हैं? 'Object.prototype' पर कोई विधि 'कॉल' नहीं है। –

+0

शायद आप समझा सकते हैं कि आप वास्तव में क्या करने की कोशिश कर रहे हैं। मुझे नहीं लगता कि आप जावास्क्रिप्ट स्तर पर प्रत्येक जावास्क्रिप्ट फ़ंक्शन कॉल को रोक सकते हैं।ऐसा करने के लिए आपको शायद जेएस इंजन के अंदर कुछ हुक तक पहुंच होनी पड़ेगी। – jfriend00

उत्तर

8

लगता है कि आपने पहलू उन्मुख प्रोग्रामिंग यहां किसी तरह का क्या करना चाहते हैं ....

जावास्क्रिप्ट, एक 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); 
} 
+0

मैं हमेशा मूल कॉल फ़ंक्शन की एक प्रति कैश करता हूं और अंत में इसका आह्वान करता हूं – user802232

0

दूसरे शब्दों में, आप अपने आवेदन के लिए किए गए किसी भी फ़ंक्शन कॉल को रोकना चाहते हैं? ऐसा करने का कोई तरीका नहीं है, कम से कम कुछ सामान्य स्तर पर नहीं।

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