Get to know MDN better
Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis juillet 2021.
Les propriétés privées sont les équivalents des propriétés de classe normales, qui sont publiques, comme les champs de classe, les méthodes de classe, etc. Les propriétés privées sont créées en utilisant un croisillon # comme préfixe et ne peuvent pas être référencée légalement en dehors de la classe. L'encapsulation de cette isolation dans la classe est gérée par le moteur JavaScript.
Les propriétés privées n'étaient pas disponibles de façon native en JavaScript avant l'apparition de cette syntaxe. En utilisant l'héritage prototypal, ce comportement pouvait être émulé avec des objets WeakMap, ou des fermetures (closures), mais cela n'était pas aussi pratique que la syntaxe avec #.
Des restrictions complémentaires s'appliquent :
Pour chaque type de propriété d'une classe, on a des équivalents privés :
Toutes ces fonctionnalités représentent des propriétés privées. Toutefois, les constructeurs ne peuvent pas être privés en JavaScript. Pour empêcher une classe d'être construite en dehors d'elle-même, il faudra utiliser un marqueur privé.
Les propriétés privées sont déclarées avec des identifiants préfixés par # (en anglais, on parle de hash names). Le préfixe avec le croisillon fait partie inhérente du nom de la propriété (on peut y voir une analogie avec l'ancienne convention utilisant un tiret bas comme préfixe _champPrive, mais il ne s'agit pas d'une propriété dont le nom est une chaîne de caractère classique et on ne peut donc pas y accéder dynamiquement en utilisant la notation avec les crochets).
Les cas suivants sont des erreurs de syntaxe :
JavaScript est un langage dynamique et peut faire cette vérification à la compilation grâce à la syntaxe particulière des propriétés privées.
Note : Le code exécuté dans la console Google Chrome permet d'accéder aux propriétés privées en dehors de la classe. Il s'agit d'une dérogation propre aux outils de développement.
Si vous tentez d'accéder à une propriété privée sur un objet qui ne dispose pas de la propriété, vous obtiendrez une exception TypeError et non undefined, comme c'est le cas pour les propriétés normales (publiques).
Cet exemple illustre également l'accès aux propriétés privées depuis les fonctions statiques et pour les instances de la classe définies par ailleurs.
L'opérateur in peut être utilisé pour vérifier si un objet tiers possède une propriété privée. L'opérateur renverra true si le champ privé existe, false sinon.
Un corollaire à cette déclaration préalable et à cette absence de suppression est que si on trouve un objet possédant au moins une propriété privée de la classe courante (via un try...catch ou une vérification in), cet objet en possèdera toutes les autres propriétés privées. Un objet possédant une propriété privée d'une classe signifie généralement qu'il a été construit par cette classe (ça n'est pas forcément le cas).
Les propriétés privées ne font par partie du modèle d'héritage prototypal, car elles ne sont accessibles qu'au sein du corps de la classe courante et ne sont pas héritées par les sous-classes. Les propriétés privées qui ont le même nom, mais des classes différentes sont totalement différentes et n'ont aucune relation entre elles. Il faut voir les propriétés privées comme des métadonnées externes rattachées à chaque instance, gérées par la classe. Pour cette raison, Object.freeze() et Object.seal() n'ont pas d'effet sur les propriétés privées.
Pour plus d'informations sur la façon dont les champs privés sont initialisés, voir la page sur les champs publics des classes.
Les champs privés regroupent les champs privés des instances et les champs privés statiques. Ils ne sont accessibles qu'au sein de la déclaration de la classe.
À l'instar de leurs homologues publics, les champs privés des instances :
Note : La propriété #champPrive, provenant de la classe de base ClasseAvecChampPrive est privée et est donc uniquement accessible à l'intérieur de ClasseAvecChampPrive et est inaccessible depuis SousClasse.
Le constructeur d'une classe peut renvoyer un objet différent, qui sera alors utilisé comme nouveau this pour le constructeur de la classe dérivée. La classe dérivée pourra alors définir des champs privés sur l'objet qui a été renvoyé, permettant ainsi indirectement d'adjoindre des champs privés pour des objets qui ne sont pas des instances.
Attention : Implémenter un tel fonctionnement sera source de confusion. Il est généralement recommandé de ne rien renvoyer à partir du constructeur, a fortiori, quelque chose qui n'a pas de lien avec this.
À l'instar de leurs homologues publics, les champs statiques privés :
Pour les champs statiques privés, seule la classe qui définit le champ statique privé peut accéder au champ. Cela peut donner des comportements inattendus lorsque this est utilisé. Dans l'exemple suivant, this fait référence à la classe SousClasse (et non à la classe ClasseAvecChampStatiquePrive), et quand on essaie d'appeler SousClasse.methodeStatiquePublique(), cela déclenche une erreur TypeError.
Le même comportement se produira si la méthode est appelée avec super, car les méthodes appelées avec super ne reçoivent pas la classe parente comme valeur pour this.
Une bonne pratique consiste à toujours accéder aux champs privés statiques avec le nom de la classe plutôt qu'avec this, afin que l'héritage ne casse pas la méthode.
Les méthodes privées incluent les méthodes privées des instances et les méthodes statiques privées. Les méthodes privées sont uniquement accessibles à l'intérieur de la déclaration de la classe.
À la différence de leurs homologues publiques, les méthodes privées des instances :
Les méthodes privées des instances peuvent être des générateurs, des méthodes asynchrones, des fonctions de génération asynchrone. Il est aussi possible de créer des accesseurs et mutateurs privés en suivant les mêmes règles de syntaxe que leurs homologues publiques (accesseur et mutateur).
À la différence des méthodes publiques, les méthodes privées ne sont pas accessibles sur la propriété .prototype de leur classe.
Comme leurs homologues publiques, les méthodes privées statiques :
Les méthodes privées statiques peuvent être des générateurs, des fonctions asynchrones, ou des générateurs asynchrones.
La même restriction évoquée pour les champs statiques privés s'applique et peut mener à des comportements inattendus lorsqu'on utilise this. Dans l'exemple suivant, quand on essaie d'appeler SousClasse.methodeStatiquePublique(), this fait référence à la classe SousClasse (et non à la classe ClasseAvecMethodePriveeStatique), ce qui entraîne une exception TypeError.
Dans d'autres langages, il est possible d'indiquer un constructeur comme privé, ce qui empêche d'instancier la classe en dehors d'elle-même. Seules des méthodes statiques de construction peuvent être utilisées pour créer des instances, voire il n'est pas possible de créer des instances. JavaScript ne dispose pas d'une syntaxe native pour ce faire, mais on peut y parvenir en utilisant un marqueur statique privé.
| ECMAScript® 2027 Language Specification # prod-PrivateIdentifier |
| ECMAScript® 2027 Language Specification # prod-00OK517S |
Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.
Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.
Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.
Cette page a été modifiée le 7 sept. 2025 par les contributeur·ice·s du MDN.
Votre modèle pour un internet meilleur.
Visitez la société mère à but non lucratif de Mozilla Corporation, la Fondation Mozilla.
Certaines parties de ce contenu sont protégées par le droit d'auteur ©1998—2026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.