IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Programmation orientée objet par prototype avec jQuery


précédentsommairesuivant

V. Tout est public, on ne peut donc rien protéger ?

Certes, en JavaScript tout est objet et tout est public, mais comme en OOP classique une fonction classe poopj peut avoir dans son constructeur des variables et des méthodes privées ou protégées.

Cette possibilité est très importante pour renforcer la sécurité d'une fonction classe. Mais on ne doit pas en abuser, car elle impacte les performances et la consommation mémoire si la fonction classe est instanciée à de multiples reprises. En effet, les variables et les méthodes privées ou protégées sont initialisées par le constructeur.

Des variables et des méthodes privées ou protégées (poopj5.html)
Sélectionnez
try {
  var Limite = $.dvjhClass._create({
	_builder: function(nombre){
		this.nombre = parseInt(nombre, 10) || 0;
		
		/*
		 * Limite est une valeur privée, elle n'est
		 * utilisable qu'à l'intérieur du constructeur.
		 */
		var limite = 9999;
		
		/*
		 * Multiplicateur est une valeur privée qui deviendra une
		 * valeur protégée par l'intermédiaire d'un accesseur
		 * et d'un mutateur.
		 */
		var multiplicateur = 2;
		
		/*
		 * L'accesseur et le mutateur sont des fonctions protégées.
		 * On peut accéder à une fonction protégée, on peut 
         * la remplacer par une autre du même nom, mais on ne 
         * peut pas altérer son contenu.
		 */
		this.getMultiplicateur = function(){
			return multiplicateur;
		}
		
		this.setMultiplicateur = function(value){
			var n = parseInt(value, 10);
			
			if (n > 0 && n < 6){
				multiplicateur = n;
			} else {
				throw("Erreur, tentative d'assigner une valeur 
                hors limites (1 à 5 inclus) au multiplicateur.")
			}
		}
		
		/*
		 * Une fonction privée.
		 *
		 * Rappel, dans une fonction privée this est windows.
		 */
		var self = this;
		
		var calcul = function(){
			var n = self.nombre * multiplicateur;
			
			if (n > limite){
				n = limite;
			} else if (n < 0){
				n = 0;
			}
			
			return n;
		}
		
		/*
		 * Résultat du calcul pour this.nombre
		 *
		 * N'écrivez jamais "this.resultat = calcul();"
		 * sinon n'importe qui, n'importe où, peut
		 * écrire : "this.resultat = 120000;"
		 */
		this.getResultat = function(){
			return calcul();
		}
	},
	toString: function(){
		return "Limite";
	}
  });

  var limite = new Limite(17);

  console.log(limite, limite.getResultat());

  limite.setMultiplicateur(5);

  console.log(limite, limite.getResultat());
}
catch(err){
  alert(err);
}

précédentsommairesuivant