2012-08-30 15 views
5

कृपया निम्नलिखित कोड का टुकड़ा चलाने के लिए और देखो क्या जे एस कंसोल में हो रहा है में एक विधि फिर से परिभाषित करने के लिए:कैसे एक "जावास्क्रिप्ट वर्ग"

मेरे सवालों का टुकड़ा में अंतिम पंक्ति के बारे में कर रहे हैं:

  1. F.prototype.method; क्यों बदला गया है?
  2. F.prototype.method को बदलने के लिए मुझे Fcustom.prototype.method को फिर से परिभाषित कैसे करना चाहिए?

नोट: मैं फ़ंक्शन का विस्तार करने के लिए jQuery और अंडरस्कोर का उपयोग कर रहा हूं।


  • टेस्ट कोड स्निपेट:

    var F = function() {}; 
    F.prototype.method = function() { 
        // some code 
    } 
    
    F.prototype.method; // it shows "some code" 
    
    
    Fcustom = $.extend(true, F, {}); 
    
    _.extend(Fcustom.prototype, { 
    method: function() { 
        // other code 
        } 
    }); 
    
    Fcustom.prototype.method; // it shows "other code" 
    
    F.prototype.method; // it shows "other code" instead of "some code" Why? 
    
+1

क्या आप 'F'' को 'Fcustom' पर क्लोन करना चाहते हैं? – pimvdb

+0

दुर्भाग्यवश आप कार्यों को क्लोन नहीं कर सकते ... –

उत्तर

3
var obj = { myMethod : function() { 
       //some code 
      } 
}; 

var newObj = $.extend(true, {}, obj); 

newObj.myMethod = function(){  
    //new method 
}; 

newObj.myMethod(); //should call the new method 

, वहीं

obj.myMethod(); //still calls the old "//some code" 

DEMO:

+0

मुझे लगता है कि आप तर्कों को '$ .extend' पर स्वैप करना चाहते हैं। – pimvdb

+0

@pimvdb: संक्षेप में। हाँ। लेकिन ऐसा माना जाता है कि यह प्रदर्शित करना बेहतर होगा कि ** पहला तर्क परिवर्तन का लक्ष्य ** है। जबकि मूल बनी हुई है। सभी 'प्रोटोटाइप' के साथ सीधे छेड़छाड़ किए बिना। –

+0

मैं समझता हूं लेकिन पहली स्निपेट की आपकी आखिरी टिप्पणी सही नहीं है, मुझे डर है। – pimvdb

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