- Fil d'ariane : Accueil du devBlog
- / Détail du billet (Lien direct)
Singleton et Javascript
Jusqu'à présent j'utilisais un pointeur global pour réaliser un singleton en Javascript. Il existe cependant une manière plus élégante de faire.
Objectifs
Nous allons réaliser une classe comprenant trois propriétés et une méthode. Le but sera de pouvoir, à chaque appel du constructeur, vérifier l'existence d'une occurence pour soit créer une instance soit renvoyer la référence à l'objet existant. Dans ce dernier cas on incrémentera également la valeur d'une propriété.
Méthode avec un pointeur global
var p = null;
function makeSingleton() {
// Si l'objet n'existe pas on le crée
if (p == null) {
p = new function() {
// Déclaration des propriétés
this.constante = new Number(123); // Constante
this.val = new Number(0);
this.chaine = new String();
// Déclaration de la méthode
this.appendString = function(val) {
p.chaine += val;
}
}
}
else {
// L'objet existe, on incrémente la propriété statique
p.val++;
}
return p;
}
Méthode avec un pointeur de classe
function makeSingleton() {
pClass = this.constructor;
if(pClass.pSingleton == undefined){
pClass.pSingleton = this;
// Déclaration des propriétés
pClass.pSingleton.constante = new Number(123); // Constante
pClass.pSingleton.val = new Number(0);
pClass.pSingleton.chaine = new String();
// Déclaration de la méthode
pClass.pSingleton.appendString = function(val) {
pClass.pSingleton.chaine += val;
}
}
else {
pClass.pSingleton.val++;
return pClass.pSingleton;
}
}
A l'usage, le script suivant fournira le même résultat dans les deux cas :
a = new makeSingleton();
a.chaine += 'Bonjour je \'appelle Thanh';
b = new makeSingleton();
// Concaténation sans méthode
b.chaine += ', j\'ai 28 ans';
c = new makeSingleton();
// Concaténation avec la méthode
c.appendString(', et je suis l\'auteur de ce blog.');
d = new makeSingleton();
// Concaténation avec la méthode
d.appendString(' Bonne lecture !');
// Affichage du résultat
alert('La chaine vaut : ' + d.chaine + '\nval est égal à ' + d.val + '\nconstante est égal à ' + d.constante);
Vous pouvez tester l'exemple dans le labo.
ps : Merci Ahmed.
Commentaires
Il n'y a pas encore de commentaires suite à ce billet.
L'ajout de commentaire a été désactivé pour ce billet.
Trackbacks
Pisteurs vers ce billet (trackbacks entrant)
Il n'y a pas encore de pisteurs pour ce billet.
Pistés par ce billet (trackbacks sortant)
Il n'y a pas encore de pisteurs effectué par ce billet.

