Le préfixe de soulignement en JavaScript n'est-il qu'une convention, comme par exemple dans les méthodes de classe privée Python?
De la documentation 2.7 Python:
Les variables d'instance «privées» auxquelles on ne peut accéder que depuis l'intérieur d'un objet n'existent pas en Python. Cependant, il existe une convention qui est suivie par la plupart du code Python: un nom préfixé avec 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 d'un membre de données) .
Est-ce que cela s'applique également à JavaScript?
Prenons par exemple ce code JavaScript:
function AltTabPopup() {
this._init();
}
AltTabPopup.prototype = {
_init : function() {
...
}
}
En outre, des variables préfixées de soulignement sont utilisées.
...
this._currentApp = 0;
this._currentWindow = -1;
this._thumbnailTimeoutId = 0;
this._motionTimeoutId = 0;
...
Seules les 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 n'a pas rendu plus intelligent la signification du préfixe de soulignement dans JavaScript.
la source
Réponses:
Bienvenue en 2019!
Il semble qu'une proposition visant à étendre la syntaxe des classes afin de permettre aux
#
variables préfixées d'être privées a été acceptée. Chrome 74 est livré avec ce support._
Les noms de variable préfixés sont considérés comme privés par convention mais restent publics.Voir https://caniuse.com/#feat=mdn-javascript_classes_private_class_fields
la source
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 l' encapsulation hors de la boîte. 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 tel comportement comme étant mauvais en premier lieu.
la source
_
j'aimerais savoir ce qui se passe!? pourquoi pas à lathis.name
place?console.log(someone._name = "Jean Dupont");
fonctionne aussi bien queconsole.log(someone.name);
, et il attribue et évalue à la fois le membre avec préfixe de soulignement derrière la propriété. Comme vous pouvez le voir , il n'y a pas d'encapsulation garantie par des traits de soulignement :)JavaScript prend en charge l'encapsulation, grâce à une méthode qui implique de masquer les membres dans les fermetures (Crockford). Cela dit, c'est parfois lourd, et la convention de soulignement est une assez bonne convention à utiliser pour des choses qui sont en quelque sorte privées, mais que vous n'avez pas vraiment besoin de cacher.
la source
JSDoc 3 vous permet d'annoter vos fonctions avec le
@access private
(précédemment le@private
tag) qui est également utile pour diffuser votre intention à d'autres développeurs - http://usejsdoc.org/tags-access.htmlla source
Outre les conventions de confidentialité, je voulais également aider à 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 URI. Les clés dépendantes pointent toujours vers une carte.
Exemple (sur https://github.com/mmikowski/urianchor ):
L'ancre URI du champ de recherche du navigateur est remplacée par:
Il s'agit d'une convention utilisée pour piloter un état d'application basé sur des modifications de hachage.
la source
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 exportez uniquement une classe (comme dans les projets angulaires), ce n'est pas du tout nécessaire.
la source