O prefixo de sublinhado no JavaScript é apenas uma convenção, como, por exemplo, nos métodos de classe privada do Python?
Na documentação do Python 2.7:
Variáveis de instância "privadas" que não podem ser acessadas, exceto de dentro de um objeto, não existem no Python. No entanto, existe uma convenção seguida pela maioria dos códigos Python: um nome prefixado com um sublinhado (por exemplo, _spam) deve ser tratado como uma parte não pública da API (seja uma função, um método ou um membro de dados) .
Isso também se aplica ao JavaScript?
Tomemos, por exemplo, este código JavaScript:
function AltTabPopup() {
this._init();
}
AltTabPopup.prototype = {
_init : function() {
...
}
}
Além disso, variáveis prefixadas com sublinhado são usadas.
...
this._currentApp = 0;
this._currentWindow = -1;
this._thumbnailTimeoutId = 0;
this._motionTimeoutId = 0;
...
Apenas convenções? Ou há mais por trás do prefixo de sublinhado?
Eu admito que minha pergunta é bem parecida com essa pergunta , mas não esclareceu a importância do prefixo de sublinhado no JavaScript.
fonte
Respostas:
Bem-vindo a 2019!
Parece que uma proposta para estender a sintaxe da classe para permitir que a
#
variável prefixada seja privada foi aceita. O Chrome 74 é enviado com esse suporte._
nomes de variáveis prefixados são considerados privados por convenção, mas ainda são públicos.Consulte https://caniuse.com/#feat=mdn-javascript_classes_private_class_fields
fonte
Isso é apenas uma convenção. A linguagem Javascript não atribui nenhum significado especial aos identificadores que começam com caracteres sublinhados.
Dito isto, é uma convenção bastante útil para um idioma que não suporta encapsulamento imediatamente. Embora não haja maneira de impedir alguém de abusar das implementações de suas classes, pelo menos isso esclarece sua intenção e documenta esse comportamento como errado em primeiro lugar.
fonte
_
eu adoraria saber o que está acontecendo !? por que não éthis.name
?console.log(someone._name = "Jean Dupont");
funciona tão bem quantoconsole.log(someone.name);
atribui e avalia o membro com prefixo sublinhado atrás da propriedade. Como você pode ver , há há encapsulamento garantida através de sublinhados :)O JavaScript realmente suporta o encapsulamento, através de um método que envolve ocultar membros em fechamentos (Crockford). Dito isto, às vezes é complicado, e a convenção de sublinhado é uma convenção muito boa para usar em coisas que são particulares, mas que você realmente não precisa esconder.
fonte
O JSDoc 3 permite que você anote suas funções com a
@access private
(anteriormente a@private
tag), que também é útil para transmitir sua intenção a outros desenvolvedores - http://usejsdoc.org/tags-access.htmlfonte
Além das convenções de privacidade, eu também queria ajudar a conscientizar que o prefixo de sublinhado também é usado para argumentos que dependem de argumentos independentes, especificamente nos mapas de âncora do URI. As chaves dependentes sempre apontam para um mapa.
Exemplo (de https://github.com/mmikowski/urianchor ):
A âncora do URI no campo de pesquisa do navegador é alterada para:
Esta é uma convenção usada para conduzir um estado de aplicativo com base em alterações de hash.
fonte
import/export
agora está fazendo o trabalho com o ES6. Eu ainda tendem a prefixar funções não exportadas com_
se a maioria das minhas funções for exportada.Se você exportar apenas uma classe (como em projetos angulares), ela não será necessária.
fonte