2010-12-19 12 views
153

¿Es el prefijo de subrayado en JavaScript que una convención, como por ejemplo en los métodos de clase privada de Python son?subrayado prefijo para los nombres de propiedades y métodos de JavaScript

De la documentación de Python 2.7:

variables de instancia “privado” que no se puede acceder desde el interior, excepto un objeto no existen en Python. Sin embargo, hay una convención que es seguida por la mayoría del código Python: un nombre con un guión bajo (por ejemplo _spam) debe tratarse como una parte no pública de la API (si es una función, un método o un miembro de datos ).

Esto también se aplica a JavaScript?

Tomemos por ejemplo el código JavaScript:

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

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

Además, el subrayado es utilizar las variables prefijadas.

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

Solo convenciones? ¿O hay más detrás del prefijo de subrayado?


admito mi pregunta es bastante similar a this question, pero no hicieron uno más inteligente sobre el significado del prefijo de subrayado en JavaScript.

+0

Véase también http://stackoverflow.com/questions/17359885/defining-properties-and-naming-conventions-in-javascript –

Respuesta

187

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

Dicho esto, es una convención bastante útil para un idioma que no admite encapsulation de fábrica. Aunque no hay forma de evitar que alguien abuse de las implementaciones de sus clases, al menos sí aclara su intención y documenta el comportamiento como incorrecto en primer lugar.

+4

Sip. Incluso si el lenguaje no lo "respalda", es una convención realmente práctica. –

+0

grave problema http://jsfiddle.net/VmFSR/ Como puedes ver, el nombre de valor creado solo es accesible al agregar un nuevo valor, creado, usando '_'. Me encantaría saber qué está pasando. ¿Por qué no es 'this.name' en su lugar? –

+1

@Muhammad Umer, no estoy seguro de entender su comentario. 'console.log (someone._name =" Jean Dupont ");' funciona tan bien como 'console.log (someone.name);', y asigna y evalúa el miembro con guión bajo detrás de la propiedad. [Como puede ver] (http://jsfiddle.net/VmFSR/1/), no hay una encapsulación garantizada mediante guiones bajos :) –

80

JavaScript realmente admite encapsulación, a través de un método que implica hiding members in closures (Crockford). Dicho esto, a veces es engorroso, y la convención del guión bajo es una convención bastante buena de usar para cosas que son más bien privadas, pero que en realidad no necesita para ocultar.

+15

Voto a favor de aclarar cómo lograr cierres, voto negativo para decir que los subrayados son una buena convención. Así que no votaré de ninguna manera :) – Jason

+3

Ocultar miembros en cierres puede a veces obstaculizar la capacidad de prueba. Echa un vistazo a este artículo: http://www.adequatelygood.com/2010/7/Writing-Testable-JavaScript –

+3

@Jason - Simplemente curioso, ¿por qué consideras subrayar una mala convención? –

11

jsdoc 3 le permite anotar sus funciones con el @access private (anteriormente la etiqueta @private), que también es útil para la difusión de su intención de otros desarrolladores -? http://usejsdoc.org/tags-access.html

7

"Sólo las convenciones O hay algo más detrás de la subrayar prefijo? "

Aparte de convenciones de privacidad, también quería ayudar a crear conciencia de que el prefijo subrayado también se utiliza para los argumentos que dependen de argumentos independientes, específicamente en los mapas de anclaje URI. Las claves dependientes siempre apuntan a un mapa.

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

$ .uriAnchor.setAnchor ({ página: 'perfil', _page: { uname: 'Wendy', en línea: 'hoy' }} ) ;

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

# page = perfil: uname, Wendy | línea, hoy

Ésta es una convención utilizada para conducir un estado de aplicación sobre la base de picadillo cambios.

1

Es preciso señalar que hay una biblioteca de JS llamada subrayado. Al usar esa biblioteca, el prefijo _ tiene significado.

http://underscorejs.org/

+0

... pero no formulé mi pregunta en ese contexto ... –

+0

La biblioteca de guiones bajos no tiene ningún significado para esta pregunta en absoluto, aunque es un buen complemento;) – Shanimal

1

import/export ahora está haciendo el trabajo con ES6. Todavía tiendo a prefijar las funciones no exportadas con _ si la mayoría de mis funciones se exportan.

Si exporta solamente una clase (como en proyectos angulares), porque no es necesario en absoluto.

Cuestiones relacionadas