2013-05-31 12 views
6

Mam następujący wzórJS moduł wzór przesłanianie funkcja

BASE = function() { 
    var that = {}; 
    var number = 10; 

    that.showNumber = function(){ 
     that.alertNumber(); 
    } 

    that.alertNumber = function() { 
     alert(number); 
    };  
    return that; 
}; 

CHILD = function() { 
    var that = Object.create(BASE()); 
    var secondNumber = 20; 

    // Override base function 
    that.alertNumber = function() { 
     alert(secondNumber); 
    }; 
    return that; 
}; 

var ch = CHILD(); 
ch.showNumber(); 

Czy możesz mi powiedzieć jak mogę dostosować mój moduł wzór inspirowany Douglas Crockforda w pełni zastąpić alerNumber funkcję? Dotychczas showNumber funkcja wyświetla 10 zamiast 20.

Dziękuję wszystkim w zaawansowanym

JSFiddle z kodem jest here

+0

Dlaczego po prostu nie użyć prototypu? To by było proste. –

+0

Dlaczego nie pisać var ​​that = new BASE(); ? – frenchie

+0

Ten wzór umożliwia wielokrotne dziedziczenie –

Odpowiedz

5

Można zmienić

that.showNumber = function(){ 
    that.alertNumber(); 
} 

do

that.showNumber = function(){ 
    this.alertNumber(); 
} 

Ale nie jestem pewien, czy widzę y nie używasz po prostu the prototype-base inheritance model.

+0

Tego nie rozumiem w pełni. Dlaczego 'this.alertNumber()' w bazie odwołuje się do 'tego' w klasie' Base'? –

+0

Ten wzorzec, którego używasz, ustawia zmienną 'that' w zamknięciu, aby upewnić się, że funkcja showNumber używa instancji zdefiniowanej w konstruktorze, co powoduje, że najbardziej zaawansowane schematy dziedziczenia nie działają (na przykład funkcja nadklasy wywołująca inną funkcję i pozwalająca jej zastąpione). –

+0

OK, jeśli dobrze to rozumiem, kiedy chcę mieć możliwość zastąpienia funkcji nadrzędnej, muszę użyć innego wzorca? Przykro mi z powodu takich noobish pytań, ale mam doświadczenie tylko w Javie, gdzie dziedziczenie jest zupełnie inne. –