Il est possible aussi de faire hériter une classe d'une autre. Voici comment j'écris monAutreClasse héritée de maClasse :
/** * monAutreClasse * @extends maClasse * @constructor */ monProjet.monAutreClasse = function(arg) { // Ces deux lignes permettent de récupérer le constructeur de la classe parente this.superclass = monProjet.maClasse; this.superclass(arg); // On peut ensuite ajouter de nouvelles variables : this.autreVar = "autre chose"; // A noter que si on veut qu'elles soient disponible dans le init, il faut les placer avant // le this.superclass }; // Ici, on clone le prototype (les méthodes) de la classe parente à la classe enfant monProjet.monAutreClasse.prototype = new superclass(); // Méthodes publiques /** * Une nouvelle méthode disponible seulement dans monAutreClasse */ monProjet.monAutreClasse.prototype.displayAutreVar = function() { alert(this.autreVar); }; /** * On redéfinie la méthode toString() */ monProjet.monAutreClasse.prototype.toString = function() { return "monAutreClasse object"; }; // On peut ensuite apeller les même méthodes que la classe parente var unSecondObjet = new monProjet.monAutreClasse("kikoo"); monProjet.maClasse.getByVar1("kikoo"); // retourne l'objet "unObjet" monProjet.maClasse.getByVar1("kikoo").autreMethode(); // Crée une alerte // mais aussi celles propres à elle même : unSecondObjet.displayAutreVar(); // Et les méthodes redéfinies : unSecondObjet.toString(); // retourne "monAutreClasse Object"
Alors ce qui est embêtant, c'est qu'on ne peut pas définir de nouvelles méthodes de prototype directement comme dans l'écriture d'une classe simple. Si j'écrivais monProjet.monAutreClasse.prototype = {…}, toute les méthodes de la classe parente seraient écrasées. Je suis obligé de les nommer les unes après les autres.
À noter aussi que le tableau contenant tout les objets créé n'est pas necessaire. Par contre, on aurait pu avoir un tableau séparé pour cette classe enfante mais il aurait fallu modifier le construteur.
Commentaires