Alors que les classes sont disponibles en JavaScript depuis ES2015, elles ne proposent pas d'attributs et de méthodes privés. Ces possibilités ont été écartées au moment de la release initiale, en raison de désaccords au sein du comité TC39. Ces spécifications à l'état de brouillon ont pour objectif de fournir ces possibilités aux classes JavaScript dans un futur proche.
Une fois que ces spécifications seront formellement acceptées, les attributs et méthodes privés pourront être définis en utilisant le signe dièse '#". La décision d'utiliser le signe dièse plutôt que le plus traditionnel underscore '_' a été fait pour éviter les "breaking changes" dans les bibliothèques existantes qui indiquent les attributs privés par ce biais.
Ceci pourrait sembler contre-intuitif, pourtant, malgré l'existence de bibliothèques indiquant les attributs ou méthodes comme privés avec le signe underscore, les développeurs continuent de les utiliser.
Le problème peut-être démontré avec une anecdote provenant de React, un framework JavaScript populaire, qui a du recourir à des noms de variables assez puissants pour dissuader les développeurs de les utiliser (bien qu'elles soient indiqués comme privées), comme '_SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED'.
Chacune des 3 propositions du comité TC39 adresse un aspect différent des attributs et méthodes privés dans les classes. Cependant, il devrait être sans danger de les traiter comme une seule proposition car elles seront vraisemblablement ajoutées à JavaScript au même moment. Les propositions sont :
DÉCLARATIONS D'ATTRIBUTS DE CLASSE EN JAVASCRIPT
Il n'est actuellement pas possible de définir directement des attributs de classe en JavaScript. À la place, les développeurs définissent ces attributs dans le contructeur.
class Counter {
constructor() {
this.xValue = 0;
}
}
Cette proposition ajoute la possibilité de définir des attributs publics et privés directement dans la définition de la classe.
class Counter {
xValue = 0;
#yValue = 0;
constructor() { }
}
MÉTHODES ET ACCESSEURS PRIVÉS POUR LES CLASSES JAVASCRIPT
Cette proposition adresse l'ajout de méthodes privées et l'utilisation d'accesseurs privés.
class Counter {
get #x() { return #xValue; }
set #x(value) { }
#clicked() { }
}
MEMBRES STATIQUES D'UNE CLASSE
Cette proposition adresse l'utilisation de champs et méthodes statiques, publics et privés.
class CustomDate {
static public() = {}
static #private() = {}
}
Il est important de noter que l'usage intensif d'attributs et méthodes privés peut porter préjudice à une base de code. Les méthodes privées ne peuvent pas être testées de façon unitaire et peuvent souvent être une indication de problèmes avec le Principe de Responsabilité Unique.
Les attributs et méthodes privés n'ont pas encore été officiellement intégrés dans JavaScript, mais les développeurs peuvent les utiliser dès maintenant avec Babel. Une implémentation TypeScript est actuellement en chantier et sera disponible dans une release ultérieure.