मुझे पता है कि मुझे पार्टी में देर हो रही है लेकिन यहाँ एक छोटी विधि है जो आपके शुरुआती प्रयासों की तर्ज पर अधिक है।
a.replace('f', String.call.bind(a.toUpperCase));
तो आप कहां गलत हो गए और यह नया वूडू क्या है?
समस्या 1
जैसा कि पहले कहा गया था, आप String.prototype.replace () के दूसरे पैरामीटर के रूप में एक तथाकथित विधि के परिणामों को पारित करने का प्रयास कर रहे थे , जब इसके बजाय आपको किसी फ़ंक्शन का संदर्भ देना चाहिए।
समाधान 1
जिसे हल करना काफी आसान है। बस मापदंडों और कोष्ठक को हटाने से हमें फ़ंक्शन को निष्पादित करने के बजाय एक संदर्भ मिलेगा।
a.replace('f', String.prototype.toUpperCase.apply)
समस्या २
यदि आप कोड को चलाने का प्रयास करते हैं, तो आपको यह बताते हुए एक त्रुटि मिलेगी कि अपरिभाषित एक फ़ंक्शन नहीं है और इसलिए इसे नहीं बुलाया जा सकता है। इसका कारण यह है कि String.prototype.toUpperCase.apply जावास्क्रिप्ट के प्रोटोटाइप वंशानुक्रम के माध्यम से वास्तव में Function.prototyp.apply () का संदर्भ है । इसलिए हम वास्तव में जो कर रहे हैं वह इस तरह दिखता है
a.replace('f', Function.prototype.apply)
जो स्पष्ट रूप से नहीं है जो हमने इरादा किया है। कैसे इसे चलाने के लिए पता है Function.prototype.apply () पर String.prototype.toUpperCase () ?
समाधान २
Function.prototyp.bind () का उपयोग करके हम विशेष रूप से String.prototype.toUpperCase पर सेट इसके संदर्भ के साथ Function.prototyp.call की एक प्रति बना सकते हैं। अब हमारे पास निम्नलिखित हैं
a.replace('f', Function.prototype.apply.bind(String.prototype.toUpperCase))
समस्या 3
अंतिम मुद्दा यह है कि String.prototyp.replace () अपने प्रतिस्थापन फ़ंक्शन के लिए कई तर्क पारित करेगा। हालाँकि, Function.prototype.apply () एक पैरामीटर होने के लिए दूसरे पैरामीटर की अपेक्षा करता है लेकिन इसके बजाय या तो एक स्ट्रिंग या संख्या प्राप्त करता है (यह निर्भर करता है कि आप कैप्चर समूहों का उपयोग करते हैं या नहीं)। यह एक अमान्य तर्क सूची त्रुटि का कारण होगा।
समाधान 3
सौभाग्य से, हम बस Function.prototype.call () में प्रतिस्थापन कर सकते हैं (जो किसी भी प्रकार के तर्कों को स्वीकार करता है, जिनमें से किसी के पास भी फ़ंक्शन के प्रकार नहीं हैं) फ़ंक्शन .prototyp.apply () । हम अब वर्किंग कोड पर आ गए हैं!
a.replace(/f/, Function.prototype.call.bind(String.prototype.toUpperCase))
बहा बाइट्स!
कोई भी बार का एक प्रकार प्रोटोटाइप टाइप नहीं करना चाहता है । इसके बजाय हम इस तथ्य का लाभ उठाएंगे कि हमारे पास ऐसी वस्तुएँ हैं जो विरासत के माध्यम से समान विधियों का संदर्भ देती हैं। स्ट्रिंग कंस्ट्रक्टर, एक फ़ंक्शन होने के नाते, फ़ंक्शन के प्रोटोटाइप से विरासत में मिला है। इसका मतलब है कि हम के लिए String.call में स्थानापन्न कर सकते हैं Function.prototype.call (वास्तव में हम और भी बाइट्स लेकिन कम अर्थ है कि बचाने के लिए Date.call उपयोग कर सकते हैं)।
हम अपने वैरिएबल 'a' का भी लाभ उठा सकते हैं क्योंकि प्रोटोटाइप में String.prototyp.toUpperCase का संदर्भ शामिल है। हम इसे a.toUpperCase के साथ स्वैप कर सकते हैं। यह ऊपर दिए गए 3 समाधानों का संयोजन है और ये बाइट बचत के उपाय हैं कि कैसे हम इस पोस्ट के शीर्ष पर कोड प्राप्त करते हैं।