web-dev-qa-db-fra.com

Préfixe de soulignement pour les noms de propriétés et de méthodes en JavaScript

Le préfixe de soulignement dans JavaScript est-il uniquement une convention, comme par exemple dans Python, les méthodes de classe privée sont?

Dans la documentation 2.7 Python:

Les variables d'instance "privées" auxquelles il est impossible d'accéder sauf à l'intérieur d'un objet n'existent pas en Python. Cependant, il existe une convention suivie par la plupart des codes Python: un nom précédé d'un trait de soulignement (par exemple, _spam) doit être traité comme une partie non publique de l'API (qu'il s'agisse d'une fonction, d'une méthode ou un membre de données).

Cela s'applique-t-il également à JavaScript?

Prenons par exemple ce code JavaScript:

function AltTabPopup() {
    this._init();
}

AltTabPopup.prototype = {
    _init : function() {
        ...
    }
}

De plus, des variables avec préfixe de soulignement sont utilisées.

    ...
    this._currentApp = 0;
    this._currentWindow = -1;
    this._thumbnailTimeoutId = 0;
    this._motionTimeoutId = 0;
    ...

Seulement des conventions? Ou y a-t-il plus derrière le préfixe de soulignement?


J'admets que ma question est assez similaire à cette question , mais cela ne rend pas plus intelligent l’importance du préfixe de soulignement en JavaScript.

209
Kenny Meyer

Bienvenue en 2019!

Il apparaît un proposition pour étendre la syntaxe de classe afin de permettre aux noms de variable avec préfixe _ d’être public et à ceux de #, le privé a été accepté. Chrome 74 expédié avec ce support.

9
Karuhanga

Ce n'est qu'une convention. Le langage Javascript ne donne aucune signification particulière aux identifiants commençant par des caractères de soulignement.

Cela dit, c’est une convention assez utile pour un langage qui ne prend pas en charge encapsulation immédiatement. Bien qu'il n'y ait aucun moyen d'empêcher quelqu'un d'abuser des implémentations de vos classes, au moins, cela clarifie votre intention, et documente un comportement comme étant incorrect dans première place.

243
Frédéric Hamidi

JavaScript prend en charge l'encapsulation, via une méthode impliquant masquage de membres dans des fermetures (Crockford). Cela dit, c'est parfois lourd, et la convention de soulignement est une très bonne convention à utiliser pour les choses qui sont en quelque sorte privées, mais que vous n'avez pas réellement besoin cacher.

95
Zach

JSDoc 3 vous permet d'annoter vos fonctions avec la balise @access private (anciennement la balise @private), qui est également utile pour diffuser votre intention à d'autres développeurs - http://usejsdoc.org/tags -access.html

13
philrabin

"Seulement des conventions? Ou y a-t-il plus derrière le préfixe de soulignement?"

Outre les conventions de confidentialité, je souhaitais également contribuer à faire prendre conscience que le préfixe de soulignement est également utilisé pour les arguments qui dépendent d'arguments indépendants, en particulier dans les cartes d'ancrage d'URI. Les touches dépendantes pointent toujours sur une carte.

Exemple (de https://github.com/mmikowski/urianchor ):

$.uriAnchor.setAnchor({
  page   : 'profile',
  _page  : {
    uname   : 'wendy',
    online  : 'today'
  }
});

L'ancre d'URI dans le champ de recherche du navigateur est remplacée par:

\#!page=profile:uname,wendy|online,today

Il s'agit d'une convention utilisée pour gérer un état d'application en fonction des modifications de hachage.

9
Sam Araiza

import/export fait maintenant le travail avec ES6. J'ai toujours tendance à préfixer les fonctions non exportées avec _ si la plupart de mes fonctions sont exportées.

Si vous n'exportez qu'une classe (comme dans les projets angular,), ce n'est pas du tout nécessaire.

export class MyOpenClass{

    open(){
         doStuff()
         this._privateStuff()
         return close();
    }

    _privateStuff() { /* _ only as a convention */} 

}

function close(){ /*... this is really private... */ }
8
Nicolas Zozol