Czy prefiks podkreślenia w JavaScript jest tylko konwencją, jak na przykład w metodach klasy prywatnej Python?
Z dokumentacji języka Python 2.7:
„Prywatne” zmienne instancji, do których dostęp jest możliwy tylko z wnętrza obiektu, nie istnieją w Pythonie. Istnieje jednak konwencja, po której następuje większość kodu w języku Python: nazwa poprzedzona znakiem podkreślenia (np. _Spam) powinna być traktowana jako niepubliczna część interfejsu API (niezależnie od tego, czy jest to funkcja, metoda czy element danych) .
Czy dotyczy to również JavaScript?
Weźmy na przykład ten kod JavaScript:
function AltTabPopup() {
this._init();
}
AltTabPopup.prototype = {
_init : function() {
...
}
}
Wykorzystywane są również zmienne z prefiksem podkreślenia.
...
this._currentApp = 0;
this._currentWindow = -1;
this._thumbnailTimeoutId = 0;
this._motionTimeoutId = 0;
...
Tylko konwencje? A może kryje się za tym prefiks?
Przyznaję, że moje pytanie jest dość podobne do tego pytania , ale nie uczyniło to mądrzejszego o znaczeniu prefiksu podkreślenia w JavaScript.
źródło
Odpowiedzi:
Witamy w 2019 roku!
Wydaje się, że zaakceptowano propozycję rozszerzenia składni klasy, aby pozwolić, aby
#
zmienna z prefiksem była prywatna. Chrome 74 jest dostarczany z tym wsparciem._
Prefiksowane nazwy zmiennych są z reguły uważane za prywatne, ale nadal są publiczne.Zobacz https://caniuse.com/#feat=mdn-javascript_classes_private_class_fields
źródło
To tylko konwencja. Język JavaScript nie nadaje żadnego specjalnego znaczenia identyfikatorom rozpoczynającym się od znaków podkreślenia.
To powiedziawszy, jest to dość przydatna konwencja dla języka, który nie obsługuje enkapsulacji po wyjęciu z pudełka. Chociaż nie ma sposobu, aby zapobiec nadużywaniu implementacji twoich klas, przynajmniej wyjaśnia twoje zamiary i przede wszystkim dokumentuje takie zachowanie jako niewłaściwe .
źródło
_
Chciałbym wiedzieć, co się dzieje !? dlaczego nie jestthis.name
zamiast tego?console.log(someone._name = "Jean Dupont");
działa równie dobrze, jakconsole.log(someone.name);
i przypisuje i ocenia element z prefiksem podkreślenia znajdujący się za właściwością. Jak widać , nie ma gwarantowanej enkapsulacji poprzez podkreślenia :)JavaScript faktycznie obsługuje enkapsulację, za pomocą metody polegającej na ukrywaniu członków w zamknięciach (Crockford). To powiedziawszy, czasami jest kłopotliwe, a konwencja podkreślenia jest całkiem dobrą konwencją do użytku w przypadku rzeczy, które są w pewnym sensie prywatne, ale których tak naprawdę nie trzeba ukrywać.
źródło
JSDoc 3 umożliwia dodawanie adnotacji do funkcji za pomocą
@access private
(poprzednio@private
tagu), co jest również przydatne do rozpowszechniania swoich zamiarów wśród innych programistów - http://usejsdoc.org/tags-access.htmlźródło
Oprócz konwencji dotyczących prywatności chciałem również pomóc uświadomić, że przedrostek podkreślenia jest również używany w przypadku argumentów zależnych od niezależnych argumentów, szczególnie w mapach kotwiczenia URI. Klucze zależne zawsze wskazują mapę.
Przykład (z https://github.com/mmikowski/urianchor ):
Kotwica URI w polu wyszukiwania przeglądarki jest zmieniana na:
Jest to konwencja używana do sterowania stanem aplikacji na podstawie zmian skrótu.
źródło
import/export
wykonuje teraz pracę z ES6. Nadal mam tendencję do prefiksu funkcji nieeksportowanych_
jeśli większość moich funkcji jest eksportowana.Jeśli eksportujesz tylko klasę (jak w projektach kątowych), nie jest ona wcale potrzebna.
źródło