Je vois certains attributs de certains objets dans JavaScript commencent par un double trait de soulignement. Par exemple, quelque chose comme __defineGetter__
ou __defineSetter__
ou __proto__
. S'agit-il d'une spécification ECMAScript définie par convention? Ou peut-être que c'est juste une convention dans la communauté des développeurs?Pourquoi certains noms d'attribut commencent par un double trait de soulignement dans JavaScript?
Répondre
Ce sont des propriétés définies par le navigateur spécifique et ne sont pas définis par ECMAScript. Par conséquent, name collision doit être évitée. S'ils appelaient la propriété defineGetter
, il n'y aurait aucune garantie que le code du site Web ne définisse pas déjà une propriété du même nom - et cela causerait beaucoup de problèmes. Cependant, l'ajout de deux traits de soulignement est devenu la manière de facto de définir les propriétés spécifiques du navigateur (car il est beaucoup moins probable que certains sites utilisent cette convention). Vous remarquerez peut-être que d'autres navigateurs utilisent la même convention de nommage que d'autres (comme __proto__
), mais cela n'est pas encore universellement garanti entre tous les navigateurs (par exemple, IE ne définit pas le __proto__ property
). En outre: la convention d'utilisation de deux caractères de soulignement pour les identificateurs "définis par le système" (par opposition aux identificateurs définis par le programmeur) revient très longtemps, donc je ne sais pas quand cette convention "a commencé" - Au moins aussi longtemps que C++ (voir http://en.wikipedia.org/wiki/Name_mangling#Simple_example)
C'est ainsi que collision de nom serait très improbable.
JavaScript a ce problème avec l'espace de noms global que tout le monde peut changer ou accéder à n'importe quoi. Il existe des techniques de masquage de données mais parfois elles ne fonctionnent pas.
Par exemple, si vous faites cela, votre jquery cessera de fonctionner:
$ = "somethingElse";
Mais est-ce une pratique recommandée, ou est-ce juste une sorte d'innovation, décidé par certains gourous gars? Je veux dire pourquoi commencer avec un trait de soulignement et rien d'autre, et pourquoi double soulignement, pas un? –
Utilisation de deux caractères de soulignement pour les variables "définies par le système" et non Les variables définies par l'utilisateur remontent longtemps, donc je ne sais pas quand cette convention a "démarré" - Au moins aussi longtemps que C++ (voir http: // fr .wikipedia.org/wiki/Name_mangling # Simple_example) –
- 1. Pourquoi double trait de soulignement (__) en PHP?
- 2. En utilisant les noms de propriétés qui commencent par un trait de soulignement (« _ »)
- 3. Qu'est-ce qu'un double trait de soulignement dans Perl?
- 4. Pourquoi les noms de clés étrangères sont-ils créés avec un trait de soulignement dans EF
- 5. Pourquoi les gens utilisent-ils tellement __ (double trait de soulignement) en C++
- 6. Javascript remplace le texte après un trait de soulignement
- 7. Pourquoi Resharper renommer les variables pour commencer avec un trait de soulignement?
- 8. Remplacer la séquence de points par un trait de soulignement
- 9. Pourquoi django doit utiliser le double trait de soulignement lors des requêtes de filtre?
- 10. Renommez plusieurs tables MySQL en insérant un trait de soulignement
- 11. Comment supprimer des fichiers commençant par un double trait d'union?
- 12. aide Regex: Faites correspondre un fichier image en commençant par un trait de soulignement
- 13. Comment puis-je remplacer toutes les occurrences d'un dollar ($) par un trait de soulignement (_) en javascript?
- 14. Pourquoi de nombreux sites nomment-ils des cookies avec un trait de soulignement?
- 15. Pourquoi beaucoup de bibliothèques javascript commencent par « (function() { »
- 16. Utilisation du trait de soulignement dans les noms de variable et de méthode
- 17. Utilisez alphanumérique avec avec trait d'union et trait de soulignement
- 18. Remplir les espaces de tableau avec un trait de soulignement
- 19. Le schéma d'URL de mai contient un trait de soulignement?
- 20. contenu: le remplacement d'un espace avec un trait de soulignement
- 21. Regex qui correspond à tout avant un trait de soulignement
- 22. Trouver les noms d'attributs qui commencent par un certain modèle
- 23. Utiliser le trait de soulignement (_) dans l'alias du menu joomla
- 24. Aller noms de fichiers commençant par caractère de soulignement
- 25. Noms de colonne et de table générés en mode hibernation avec trait de soulignement
- 26. Convertit le setter Pascal en un nom de variable séparé par un trait de soulignement
- 27. Remplacer tous les espaces par un trait de soulignement dans le bloc sélectionné
- 28. mettre un trait de soulignement à sa place
- 29. Pourquoi le symbole de la fonction SHA512 dans libeay32 n'a pas de trait de soulignement?
- 30. Quelle est la signification d'un trait de soulignement dans Perl ($ _, @_)?
Donc, jusqu'à ici, double underscores est un standard _defacto_ des navigateurs, un soulignement est ce standard _defacto_ des bibliothèques (comme Microsoft.Ajax ou jQuery). Ai-je raison? –
Je ne pense pas qu'il existe une convention globale sur la façon dont les frameworks définissent leurs variables. Pourtant, la "meilleure pratique" consiste à définir seulement 1 objet global (comme l'objet 'google' ou l'objet' jQuery'), puis à définir toutes vos méthodes/variables dans la portée de cet objet. Et c'est pour éviter exactement le problème de la collision de noms. Cependant, cela ne signifie nullement que chaque cadre le fait de cette façon. –
En outre, les variables de navigateur ne sont souvent pas des variables globales du tout, comme le sont parfois les variables de structure. Ils sont normalement des propriétés ajoutées à chaque objet. Peut-être via 'Object.prototype' ou d'une autre manière. –