5 votes

Méthode des modèles en javascript

Je veux, en javascript, mettre en œuvre le modèle de méthode de template.

J'ai un PropertyDecorator avec quelques sous-classes : OpenButtonDecorator, SeeButtonDecorator et ainsi de suite. Je veux avoir dans le décorateur de propriété la fonction suivante :

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

Comment puis-je faire fonctionner ce scénario ? Peut-être que j'ai mal implémenté l'héritage :S (aide pour cela aussi :) )

Merci d'avance.

12voto

Miguel Points 381

Javascript est un langage dynamique typé, basé sur des prototypes. La méthode des templates est un modèle de conception et est donc indépendante du langage, mais sa mise en œuvre peut varier d'un langage à l'autre.

Dans le cas de javascript, et aussi dans d'autres langages typés dynamiquement, comme ruby, les classes et interfaces abstraites n'ont pas beaucoup de sens, puisque la liaison dynamique se fait par délégation. (Un appel de méthode est propagé aux niveaux supérieurs de l'arbre d'héritage jusqu'à ce qu'un prototype puisse traiter la demande). Ceci, en conjonction avec le typage en canard, qui signifie que n'importe quelle méthode peut être potentiellement appelée sur n'importe quelle instance, évite le besoin d'un contrat explicite, qui dans les langages basés sur les classes est défini par les méthodes déclarées qui sont visibles sur un certain type.

Ainsi, pour mettre en œuvre le modèle, il suffit d'appeler une méthode inexistante sur la méthode de construction du prototype du parent (cette méthode sera le modèle) et d'implémenter simplement cette méthode sur les sous-catégories :

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());
}

La répartition d'une méthode se fait de cette manière :

  • La méthode est-elle invoquée dans l'instance ?
    • Non -> Déléguer l'appel au parent (son prototype) et répéter.
    • Oui-> Exécuter le corps de la méthode dans le contexte de l'objet implicite (celui qui a reçu l'appel au début).

Ainsi, lorsque l'on appelle new SeeButtonDecorator().build(), on essaie d'abord d'exécuter la méthode build sur l'instance. Comme elle n'est pas définie dans l'instance, l'invocation de la méthode sera déléguée au parent de l'instance, qui dans ce cas, le prototype SeeButtonDecorator, celui-ci, n'a pas non plus la méthode, donc il déléguera l'appel à son parent (PropertyDecorator). PropertyDecorator, possède la méthode build() méthode.

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

En l'exécutant, build sera évalué dans le contexte de la nouvelle méthode SeeButtonDecorator(). L'instance elle-même n'aura pas de decorate() car elle est définie dans la fonction SeeButtonDecorator() (son prototype). Cette fois-ci, l'appel sera délégué au prototype de l'instance, qui aura finalement une méthode decorate() :

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

La méthode sera à nouveau exécutée dans le contexte de l'instance, et renverra la chaîne de caractères, en remontant dans la pile d'appels jusqu'à ce qu'elle retourne

The decoration I did: see button

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X