¿El prefijo de guión bajo para los nombres de propiedades y métodos es simplemente una convención?

Resuelto Kenny Meyer asked hace 14 años • 6 respuestas

¿El prefijo de guión bajo en JavaScript es solo una convención, como lo son, por ejemplo, los métodos de clase privada de Python?

De la documentación de Python 2.7:

Las variables de instancia "privadas" a las que no se puede acceder excepto desde dentro de un objeto no existen en Python. Sin embargo, existe una convención que sigue la mayoría del código Python: un nombre con el prefijo de guión bajo (por ejemplo, _spam) debe tratarse como una parte no pública de la API (ya sea una función, un método o un miembro de datos). .

¿Esto también se aplica a JavaScript?

Tomemos, por ejemplo, este código JavaScript:

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

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

Además, se utilizan variables con prefijo de subrayado.

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

¿Solo convenciones? ¿O hay más detrás del prefijo de guión bajo?


Admito que mi pregunta es bastante similar a esta pregunta , pero no nos hizo más inteligentes sobre el significado del prefijo de guión bajo en JavaScript.

Kenny Meyer avatar Dec 20 '10 01:12 Kenny Meyer
Aceptado

Eso es sólo una convención. El lenguaje Javascript no otorga ningún significado especial a los identificadores que comienzan con caracteres de subrayado.

Dicho esto, es una convención bastante útil para un lenguaje que no admite la encapsulación lista para usar. Aunque no hay forma de evitar que alguien abuse de las implementaciones de sus clases, al menos aclara su intención y documenta dicho comportamiento como incorrecto en primer lugar.

Frédéric Hamidi avatar Dec 19 '2010 18:12 Frédéric Hamidi

JavaScript en realidad admite la encapsulación, a través de un método que implica ocultar miembros en cierres (Crockford). Dicho esto, a veces es engorroso, y la convención de guión bajo es una convención bastante buena para usar en cosas que son algo privadas, pero que en realidad no es necesario ocultar.

Zach avatar Dec 21 '2010 23:12 Zach

¡Bienvenidos al 2019!

Parece que se aceptó una propuesta para ampliar la sintaxis de la clase para permitir que #la variable con prefijo sea privada. Chrome 74 se envía con este soporte.

_Los nombres de variables con prefijo se consideran privados por convención, pero siguen siendo públicos.

Esta sintaxis intenta ser concisa e intuitiva, aunque es bastante diferente de otros lenguajes de programación.

¿Por qué se eligió el sigilo # entre todos los puntos del código Unicode?

  • @ era el favorito inicial, pero se lo llevaron los decoradores. TC39 consideró intercambiar decoradores y sellos estatales privados, pero el comité decidió ceder al uso existente de usuarios de transpiladores.
  • _ causaría problemas de compatibilidad con el código JavaScript existente, lo que ha permitido _ al comienzo de un identificador o nombre de propiedad (pública) durante mucho tiempo.

Esta propuesta llegó a la Etapa 3 en julio de 2017. Desde entonces, se ha reflexionado y discutido extensamente sobre varias alternativas. Al final, este proceso de reflexión y la participación comunitaria continua llevaron a un consenso renovado sobre la propuesta en este repositorio. Sobre la base de ese consenso, las implementaciones de esta propuesta están avanzando.

Ver https://caniuse.com/#feat=mdn-javascript_classes_private_class_fields

karuhanga avatar May 19 '2019 08:05 karuhanga

"¿Sólo convenciones? ¿O hay más detrás del prefijo de guión bajo?"

Además de las convenciones de privacidad, también quería ayudar a crear conciencia de que el prefijo de guión bajo también se usa para argumentos que dependen de argumentos independientes, específicamente en mapas de anclaje de URI. Las claves dependientes siempre apuntan a un mapa.

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

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

El ancla URI en el campo de búsqueda del navegador se cambia a:

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

Esta es una convención que se utiliza para controlar el estado de una aplicación en función de los cambios de hash.

Sam Araiza avatar Aug 26 '2014 18:08 Sam Araiza