2010-10-08 13 views
5

Chcę, w javascript, zaimplementować wzór metody szablonu.Metoda szablonów w javascript

Posiadam PropertyDecorator z niektórymi podklasami: OpenButtonDecorator, SeeButtonDecorator i tak dalej. Chcę mieć w dekoratorze właściwości następną funkcję:

var build = function(){ 
    decorate(); //Abstract in PropertyDecorator, defined in subclasses 
    return le.build(); 
} 

Jak mogę uruchomić ten scenariusz? Może zaimplementowałem błędnie dziedziczenie: S (z tym też pomoc :))

Z góry dziękuję.

Odpowiedz

11

Javascript jest dynamicznym, pisanym na maszynie, opartym na prototypach językiem. Metoda szablonowa to wzorzec projektowy, a zatem niezależny od języka, ale jego implementacja może być różna w różnych językach.

W przypadku javascript, a także w innych dynamicznie pisanych językach, takich jak ruby, klasy abstrakcyjne i interfejsy, nie ma większego sensu, ponieważ dynamiczne łączenie odbywa się za pośrednictwem delegacji. (Wywołanie metody jest propagowane na wyższe poziomy w drzewie dziedziczenia do czasu, gdy prototyp nie obsłuży żądania). To w połączeniu z typowaniem kaczym, co oznacza, że ​​dowolna metoda może być potencjalnie wywoływana w dowolnej instancji, unika potrzeby wyraźnej umowy, która w językach opartych na klasach jest zdefiniowana przez deklarowane metody, które są widoczne na określonym typie.

Tak więc w celu realizacji wzorca, tylko wezwać zerową metodę na metodzie prototyp zbudować rodzica (ta metoda będzie szablon) i po prostu wdrożyć tę metodę na sublcasses:

function PropertyDecorator() 
{ 
    this.build = function() 
    { 
     var decoration=this.decorate(); 
     return "The decoration I did: "+decoration; 
    }; 
} 

//we set the parent (those prototype that instances of this class will delegate calls to) 
OpenButtonDecorator.prototype = new PropertyDecorator(); 
function OpenButtonDecorator() 
{ 
    this.decorate = function() 
    { 
    return "open button"; 
    }; 
} 


SeeButtonDecorator.prototype = new PropertyDecorator(); 
function SeeButtonDecorator() 
{ 
    this.decorate = function() 
    { 
     return "see button"; 
    }; 
} 



var decorators=Array(new SeeButtonDecorator(),new OpenButtonDecorator()); 
for (var decorator in decorators){ 
    document.writeln(decorators[decorator].build()); 
} 

Sposób wysyłki występuje w następujący sposób:

  • Czy instancja ma wywoływaną metodę?
    • Nie - Deleguj połączenie z rodzicem (to prototyp) i powtórz.
    • Tak-> Wykonaj treść metody w kontekście niejawnego obiektu (tego, który odebrał wywołanie na początku).

Tak więc, gdy dzwoni nowy SeeButtonDecorator(). Zbudować(), po pierwsze, że będzie starał się wykonać metodę kompilacji na przykład. Ponieważ nie jest to zdefiniowane w instancji, wywołanie metody zostanie przekazane do rodzica instancji, który w tym przypadku jest prototypem SeeButtonDecorator, ten nie ma również tej metody, więc przekaże połączenie do jej rodzica (PropertyDecorator). PropertyDecorator, ma metodę build().

function PropertyDecorator() 
{ 
    this.build = function() 
    { 
     var decoration=this.decorate(); 
     return "The decoration I did: "+decoration; 
    }; 
} 

Podczas wykonywania go, ciało build METHOD zostaną ocenione w kontekście nowej SeeButtonDecorator(). Sama instancja nie będzie miała metody decorate(), ponieważ jest zdefiniowana w funkcji SeeButtonDecorator() (jej prototyp). Cóż, tym razem połączenie zostanie przekazane do prototypu instancji wich ostatecznie dostał udekorować() metoda:

function SeeButtonDecorator() 
{ 
    this.decorate = function() 
    { 
     return "see button"; 
    }; 
} 

Metoda zostanie wykonany w kontekście ponownie instancji i zwróci ciąg, spada z powrotem w stos wywołań aż powrocie

The decoration I did: see button 
+0

doskonałą odpowiedź –

Powiązane problemy