2012-04-07 12 views
5
// I am trying to make a clone of String's replace function 
// and then re-define the replace function (with a mind to 
// call the original from the new one with some mods) 
String.prototype.replaceOriginal = String.prototype.replace 
String.prototype.replace = {} 

यह अगली पंक्ति अब टूट गया है के साथ जावास्क्रिप्ट प्रोटोटाइप को बदलने के लिए - मैं कैसे ठीक करूं? वास्तविक मूल .replace गायब हो जाएगा:कैसे कस्टम समारोह

"lorem ipsum".replaceOriginal(/(orem |um)/g,'') 
+4

यह मेरे लिए (फ़ायरफ़ॉक्स में) ठीक काम करता है। यह मदद कर सकता है अगर आप "टूटा" मतलब बताएंगे। – Pointy

+1

सहमत है, यह क्रोम में भी ठीक काम करता है: http://jsfiddle.net/4hPhG/ –

+0

एकमात्र चीज जो मैं देख सकता हूं कि आपके कोड में गलत है, पहले बयान पर लापता है; –

उत्तर

16

ही संभव मुद्दा यह है कि अपने कोड दो बार निष्पादित किया जाता है, जो समस्याओं का कारण बनता है। मौजूदा कार्यक्षमता

  • संदर्भ है तोड़ने

    (function(replace) {       // Cache the original method 
        String.prototype.replace = function() { // Redefine the method 
         // Extra function logic here 
         var one_plus_one = 3; 
         // Now, call the original method 
         return replace.apply(this, arguments); 
        }; 
    })(String.prototype.replace); 
    
    • यह अनुमति देता है कई विधि संशोधन बिना:

      इस तरह की समस्याओं से बचने के लिए, मैं दृढ़ता से निम्नलिखित सामान्य विधि का उपयोग कर निर्मित तरीकों को बदलने के लिए सलाह देते हैं .apply() द्वारा संरक्षित: आमतौर पर, this ऑब्जेक्ट (प्रोटोटाइप) विधियों के लिए महत्वपूर्ण है।

  • +0

    अन्य मुद्दे भी हो सकते हैं। उदाहरण (सिर्फ काल्पनिक रूप से) 'replace' पुनरावर्ती और कुछ मामलों कॉल" ही "' this.replace (...) 'विभिन्न मापदंडों (सिवाय इसके कि यह अपने आप में लेकिन एक और असंगत विधि कॉल नहीं होगा) के साथ प्रयोग में है। सामान्य रूप से एक असंगत विधि के साथ एक पूर्वनिर्धारित विधि को प्रतिस्थापित करने के लिए काम नहीं किया जा रहा है जबतक कि आप यह भी नहीं जानते कि वास्तव में कौन सी पूर्वनिर्धारित विधि कॉल करती है। निर्भरता ग्राफ को जानने के बिना एक सामान्य लाइब्रेरी में एक असंगत व्यक्ति के साथ फ़ंक्शन को प्रतिस्थापित करने से यह अलग नहीं है। – 6502

    +0

    यह बिल्कुल सही था - मैं दो बार निष्पादित कर रहा था, इसलिए मूल ओवरराइट हो रहा था। स्कूलबॉय त्रुटि। कुछ अन्य उपयोगी पॉइंटर्स के साथ पूरी तरह से जवाब के लिए धन्यवाद। –

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