2012-08-30 15 views
5

uruchom następujący fragment kodu i zobaczyć, co dzieje się w konsoli JS:Jak ponownie zdefiniować metodę w „javascript klasy”

Moje pytania są odnośnie ostatniej linii w urywka:

  1. Dlaczego zmieniono F.prototype.method;?
  2. Jak mogę zmienić definicję Fcustom.prototype.method, aby nie zmieniać F.prototype.method?

Uwaga: używam jQuery i podkreślenia rozszerzenie funkcji.


  • kod testowy fragment:

    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

Czy chcesz sklonować funkcję 'F' do' Fcustom'? – pimvdb

+0

Niestety nie można klonować funkcji ... –

Odpowiedz

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

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

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

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

Chociaż

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

DEMO:

+0

Myślę, że zamierzałeś zamienić argumenty na '$ .extend'. – pimvdb

+0

@pimvdb: W skrócie. Tak. Ale pomyślał, że lepiej będzie pokazać, że ** pierwszy argument jest celem zmiany **. Podczas gdy oryginał pozostaje nietknięty. Wszystko bez bezpośredniej ingerencji w "prototyp". –

+0

Rozumiem, ale ostatnia uwaga dotycząca pierwszego fragmentu jest nieprawidłowa, obawiam się. – pimvdb

Powiązane problemy