11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'imagine qu'un tas de personnes se sont penchées sur l'émulation de membres privés en Javascript. La méthode la plus connue consiste à créer des variables locales accessibles par getter, directement dans le constructeur de la classe.

Dans de petites classes et pour de petits projets, c'est une solution viable. Cependant, lorsqu'il s'agit de baser un framework dessus, la question des ressources se pose et dissuade le plus souvent.

Existe t-il des méthodes (re)connues et relativement performantes ?

J'ai par ailleurs fait un petit essai :

var Private = function(oPrototype) {
	var F = function(oInstance, called) {
		if(arguments.length === 0) return;
					
		if(isBoolean(called) && called === true) {
			if(!isString(oInstance.$$private)) {
				oInstance.$$private = (parseInt(Math.random() * 1000000) + new Date().getTime()).toString();
				this[oInstance.$$private] = new this;
			}
						
			return this[oInstance.$$private];
		}
					
		return F.call(F, oInstance, true);
	};
				
	F.prototype = oPrototype;
	return F;
};

Que l'on peut implémenter comme ceci :

(function() {

	var P = new Private({
		member1: null,
		member2: null
	});

	MyClass = function(p1, p2, p3) {
		P(this).member1 = p1;
		P(this).member2 = p2;
		this.member3 = p3;
	};

	MyClass.prototype = {
		getMember: function(num) {
			return P(this)["member" + num];
		}
		// ...
	};

})();


Tout reste bien évidemment ouvert à toute proposition.
Merci.
function MyClass(p1, p2) {
	var member1 = p1;
	var member2 = p2;

	this.getMember1 = function() { return member1; };
	this.getMember2 = function() { return member2; };
}

les variables member1 et member2 sont locales au constructeur. Donc personne n'y a accès autrement que par les deux méthodes de type getter qui les close, donc elles sont privées.

Et je parle d'émulation car sans les closure il serait impossible de faire comme en java par exemple où un simple mot-clé "private" suffit.

J'vois pas quoi te dire d'autre Smiley rolleyes
Ok... je vois tout à fait mais j'y etais pas du tout du tout...

Je ne me suis jamais interressé à la visibilité des attributs et méthodes des objets JS (bien que connaissant très bien le procédé en Java), je vais me faire une joie de suivre cette file sans pour autant pouvoir t'aider. Smiley lol