Le javascript est aujourd’hui largement utilisé sur le Web. Tous les navigateurs implémentent leur moteur javascript, et il est évidemment le langage incontournable quand il s’agit d’utiliser WebGL ou WebCL.
Il est présenté comme un langage objet, mais ses capacités à ce niveau restent nativement limitées. Notamment, l’héritage n’est pas prévu. Lorsqu’on développe une application conséquente, l’héritage est pourtant un facteur indispensable pour réduire la quantité de code et donc les coûts de développement d’une application.
Il existe plusieurs méthodes pour contourner cette faiblesse du langage, et nous allons vous en présenter une, qui est à notre avis la plus souple et la plus élégante. Selon la terminologie de Douglas Crockford, il s’agit d’un pattern d’héritage « fonctionnel ». Rien ne vaut un exemple, alors en voici un :
var motherClass = function (spec) {
var that = {}; // création de l'objet retourné
that.get_name = function () { // "virtual" method
}
return that;
}
var daughterClass = function (spec) {
spec.name = spec.name || "";
var that = motherClass(spec); // l'héritage est ici : on initialise l'objet retourné en utilisant le constructeur de la classe mère
that.get_name = function () { // on spécifie le code de la méthode "virtuelle" mère
return "daughterClass : " + spec.name;
}
return that;
}
var instance = daughterClass({name: "daughter"}); // instanciation
console.log(instance.get_name ());
daughterClass : daughter
On peut alors spécifier plusieurs classes héritant de « motherClass ».
Une autre classe pourrait par exemple être :
var daughterClass2 = function (spec) {
spec.name = spec.name || "";
var that = motherClass(spec); //héritage ici!
that.get_name = function () { // et respecification de l'interface
return "daughterClass2 : " + spec.name;
}
that.special_to_this_class = function () { // methode specifique à la classe daughterClass2
return "special";
}
return that;
}
Et on peut alors utiliser cela dans un même tableau (c’est un avantage du non-typage javascript) :
var tab = [];
tab[0] = daughterClass({name: "1"});
tab[1] = daughterClass2({name: "2"});
for (var i = 0 ; i < 2 ; ++i) { console.log(tab[i].get_name ()); }
daughterClass : 1 daughterClass2: 2
Après cela il ne tient qu’à vous d’enrichir les méthodes pour obtenir ce que vous voulez!
PS : notez que dans ces classes, on ne peut accéder aux attributs autrement qu’avec la méthode get. C’est un forme d’encapsulation des données!