#Le modèle objet de Backbone
Sommaire
- Un petit tour dans le code
- Une classe de base
- Héritage
Ce qui est souvent déstabilisant pour le développeur Java (PHP, .Net, etc. ....) c’est le modèle objet de javascript qui diffère du classique modèle orienté « classes » que nous connaissons tous (normalement). De nombreux ouvrages, articles, … se sont attaqués au sujet, mais ce n’est pas l’objet de ce chapitre.
Je vais vous présenter de quelle façon Backbone gère son « Orientation objet » et comment réutiliser cette fonctionnalité. L’objectif est double : mieux comprendre le fonctionnement de Backbone et vous donner un moyen de faire de l’objet en javascript sans être dépaysé (quelque chose qui ressemble dans sa logique, à ce que vous connaissez déjà).
##Un petit tour dans le code
Si vous avez la curiosité d’aller lire le code de Backbone (je vous engage à le faire, le code est clair et simple et avec le temps très instructif), vous « tomberez » sur une ligne particulièrement intéressante (vers la fin du code source dans backbone.js
pour ceux qui iront réellement lire le code) :
// Set up inheritance for the model, collection, and view.
Model.extend = Collection.extend = Router.extend = View.extend = extend;
Il existe une méthode (privée) extend
dans Backbone qui permet à un objet d’hériter des membres d’un autre objet, par exemple, si j’écris:
/*--- Modèle article ---*/
// une "sorte" de classe Article
var Article = Backbone.Model.extend({
});
Je signifie que je crée une “sorte” de classe Article
qui hérite des fonctionnalités de Model
. De la même façon je pourrais ensuite définir une autre classe ArticleSpecial
qui héritera de Article
(et qui conservera les spécificités (membres de classe) de Model
):
var ArticleSpecial = Article.extend({
});
Je vous expliquais que la méthode extend
était privée, Backbone ne l’expose pas directement, mais il est tout à fait possible d’y accéder par un des composants de Backbone, de la façon suivante :
var Kind = function() {};
Kind.extend = Backbone.Model.extend;
Remarque 1 : J’ai utilisé « Kind » pour ne pas utiliser « Class » ou « class » qui est un terme réservé pour les futures versions de javascript.
Remarque 2 : Je vais utiliser du français dans mon code. Je sais c’est moche, promis j’essaye de ne plus le faire (à part dans les commentaires)
Nous pouvons donc maintenant écrire :
var Personne = Kind.extend({});
##1ère "classe"
Voyons donc ce que nous apporte le modèle objet de Backbone.
###Un constructeur
La déclaration d’un constructeur se fait avec le mot clé constructor
:
Utilisation de Kind.extend()
et définition de constructor()
var Personne = Kind.extend({
constructor: function() {
console.log("Bonjour, je suis le constructeur de Personne");
}
});
var bob = new Personne();
Nous obtiendrons à l’éxécution :
Bonjour, je suis le constructeur de Personne
###Des propriétés
Les propriétés se déclarent dans le constructeur (elles sont générées à l’exécution), et vous pouvez déclarer les valeurs par défaut à l’extérieur du constructeur :
Ajout de propriétés
var Personne = Kind.extend({
prenom: "John",
nom: "Doe",
constructor: function(prenom, nom) {
if (prenom) this.prenom = prenom;
if (nom) this.nom = nom;
console.log("Bonjour, je suis ", this.prenom, this.nom);
}
});
var john = new Personne();
var bob = new Personne("Bob", "Morane");
Nous obtiendrons à l’éxécution :
Bonjour, je suis John Doe Bonjour, je suis Bob Morane
###Des méthodes
Les méthodes se déclarent de la même façon que le constructeur, ajoutons une méthode bonjour()
:
Ajout d’une méthode
var Personne = Kind.extend({
prenom: "John",
nom: "Doe",
constructor: function(prenom, nom) {
if (prenom) this.prenom = prenom;
if (nom) this.nom = nom;
},
bonjour: function() {
console.log("Bonjour, je suis ", this.prenom, this.nom);
}
});
var john = new Personne();
var bob = new Personne("Bob", "Morane");
john.bonjour();
bob.bonjour();
Nous obtiendrons à l’éxécution :
Bonjour, je suis John Doe Bonjour, je suis Bob Morane
###Des membres statiques
La méthode extend
accepte un deuxième paramètre qui permet de déclarer des membres statiques :
Ajout & utilisation de membres statiques
var Personne = Kind.extend({
prenom: "John",
nom: "Doe",
constructor: function(prenom, nom) {
if (prenom) this.prenom = prenom;
if (nom) this.nom = nom;
//Utilisation de la propriété statique
Personne.compteur += 1;
},
bonjour: function() {
console.log("Bonjour, je suis ", this.prenom, this.nom);
}
}, { //ici les membres statiques
compteur: 0,
combien: function() {
return Personne.compteur;
}
});
var john = new Personne();
var bob = new Personne("Bob", "Morane");
console.log("Il y a ", Personne.combien(), " personnes");
Nous avons donc une propriété statique compteur
et une méthode statique combien()
. Nous obtiendrons ceci à l’exécution :
Il y a 2 personnes
##Sans héritage point de salut ! … ?
Même s’il ne faut pas abuser de l’héritage en programmation objet (mais c’est un autre débat), il faut avouer que cela peut être pratique pour la structuration de notre code. Dès le départ, dans ce chapitre nous avons fait de l’héritage :
var Personne = Kind.extend({ });
Donc Personne
hérite de Kind
. Mais essayons un exemple plus complet pour bien appréhender les possibilités de Backbone. Personne
héritant de Kind
possède donc aussi une méthode extend
, nous allons donc pouvoir créer une Femme
et un Homme
:
var Homme = Personne.extend({
sexe: "male"
});
var Femme = Personne.extend({
prenom: "Jane",
sexe: "femelle"
});
var jane = new Femme();
var john = new Homme();
var angelina = new Femme("Angelina", "Jolie");
var bob = new Homme("Bob", "Morane");
jane.bonjour();
john.bonjour();
angelina.bonjour();
bob.bonjour();
console.log("Il y a ", Personne.combien(), " personnes");
A l’exécution nous obtiendrons ceci :
Bonjour, je suis Jane Doe Bonjour, je suis John Doe Bonjour, je suis Angelina Jolie Bonjour, je suis Bob Morane Il y a 4 personnes
Nous pouvons donc vérifier que l’on a bien hérité de la méthode bonjour()
, du constructeur constructor()
et de nom
et prenom
(ainsi que de leurs valeurs par défaut). Nous remarquons aussi que l’incrémentation des “personnes” continue puisque Homme
et Femme
héritent de Personne
.
Voyons maintenant, comment surcharger les méthodes du parent et continuer à appeler les méthodes du parent.
##Surcharge & super
Modifions le code des “pseudo classes” de la façon suivante :
Surcharge et utilisation de super()
var Homme = Personne.extend({
sexe: "male",
//surcharge du constructeur
constructor: function(prenom, nom) {
//appeler le constructeur de Personne
Homme.__super__.constructor.call(this, prenom, nom);
console.log("Hello, je suis un ", this.sexe);
},
bonjour: function() {
//appeler la methode bonjour() du parent
Homme.__super__.bonjour.call(this);
console.log("Bonjour, je suis un garçon");
}
});
var Femme = Personne.extend({
prenom: "Jane",
sexe: "femelle",
//surcharge du constructeur
constructor: function(prenom, nom) {
//appeler le constructeur de Personne
Femme.__super__.constructor.call(this, prenom, nom);
console.log("Hello, je suis une ", this.sexe);
},
bonjour: function() {
//appeler la methode bonjour() du parent
Femme.__super__.bonjour.call(this);
console.log("Bonjour, je suis une fille");
}
});
var angelina = new Femme("Angelina", "Jolie");
var bob = new Homme("Bob", "Morane");
angelina.bonjour();
bob.bonjour();
Nous avons surchargé les constructeurs pour pouvoir afficher un message au moment de l’instanciation et nous avons appelé le constructeur du parent pour continuer à permettre l’affectation de nom
et prenom
. Nous avons appliqué le même principe pour la méthode bonjour()
. Donc l’appel d’une méthode du parent se fait de la manière suivante : Nom_de_la_classe_courante.__super__.methode.call(this, paramètres)
.
A l’exécution nous obtiendrons donc :
Hello, je suis une femelle Hello, je suis un male Bonjour, je suis Angelina Jolie Bonjour, je suis une fille Bonjour, je suis Bob Morane Bonjour, je suis un garçon
##Conclusion
Nous venons de voir comment continuer à programmer objet sans trop boulverser vos habitudes (cela ne doit pas vous empêcher d’étudier le modèle objet de javascript plus en profondeur). Cela va vous permettre de mieux structurer votre code (et en javascript, c’est important) mais aussi vos idées, de comprendre le fonctionnement de Backbone, mais de pouvoir aussi écrire des extensions à Backbone plus facilement.