Twitter

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.

Saisir un commentaire

Vous pouvez utilisez les balises HTML suivantes, ainsi que les attributs associés : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Photographie

Tranches de vie on Facebook