Ist das Unterstrichpräfix in JavaScript nur eine Konvention, wie sie beispielsweise in Python-Methoden für private Klassen verwendet wird?
Aus der 2.7 Python-Dokumentation:
In Python gibt es keine "privaten" Instanzvariablen, auf die nur innerhalb eines Objekts zugegriffen werden kann. Es gibt jedoch eine Konvention, die von den meisten Python-Codes befolgt wird: Ein Name mit einem Unterstrich (z. B. _spam) sollte als nicht öffentlicher Teil der API behandelt werden (unabhängig davon, ob es sich um eine Funktion, eine Methode oder ein Datenelement handelt). .
Gilt das auch für JavaScript?
Nehmen Sie zum Beispiel diesen JavaScript-Code:
function AltTabPopup() {
this._init();
}
AltTabPopup.prototype = {
_init : function() {
...
}
}
Außerdem werden Variablen mit Unterstrichen vorangestellt.
...
this._currentApp = 0;
this._currentWindow = -1;
this._thumbnailTimeoutId = 0;
this._motionTimeoutId = 0;
...
Nur Konventionen? Oder steckt mehr hinter dem Unterstrich?
Ich gebe zu, dass meine Frage dieser Frage ziemlich ähnlich ist , aber sie hat die Bedeutung des Unterstrichpräfixes in JavaScript nicht klüger gemacht.
quelle
Antworten:
Willkommen im Jahr 2019!
Es scheint ein Vorschlag zur Erweiterung der Klassensyntax zu sein, damit die
#
Variable mit dem Präfix privat sein kann. Chrome 74 Schiffe mit dieser Unterstützung._
Präfixvariablennamen werden gemäß Konvention als privat betrachtet, sind jedoch weiterhin öffentlich.Siehe https://caniuse.com/#feat=mdn-javascript_classes_private_class_fields
quelle
Das ist nur eine Konvention. Die Javascript-Sprache gibt Bezeichnern, die mit Unterstrichen beginnen, keine besondere Bedeutung.
Das heißt, es ist eine ziemlich nützliche Konvention für eine Sprache, die keine sofortige Kapselung unterstützt . Obwohl es keine Möglichkeit gibt, jemanden daran zu hindern, die Implementierungen Ihrer Klassen zu missbrauchen, klärt dies zumindest Ihre Absicht und dokumentiert ein solches Verhalten, das in erster Linie falsch ist .
quelle
_
Ich würde gerne wissen, was los ist!? warum ist es nichtthis.name
stattdessen?console.log(someone._name = "Jean Dupont");
funktioniert genauso gut wieconsole.log(someone.name);
und weist das Element mit dem Unterstrich vor der Eigenschaft zu und wertet es aus. Wie Sie sehen können , gibt es keine garantierte Einkapselung durch Unterstriche :)JavaScript unterstützt tatsächlich die Kapselung durch eine Methode, bei der Mitglieder in Verschlüssen versteckt werden (Crockford). Das heißt, es ist manchmal umständlich, und der Unter Konvention ist eine ziemlich gute Konvention für Dinge zu verwenden , die Art von privat sind, aber dass Sie nicht wirklich brauchen , sich zu verstecken.
quelle
Mit JSDoc 3 können Sie Ihre Funktionen mit dem
@access private
(zuvor dem@private
Tag) versehen, was auch nützlich ist, um Ihre Absicht an andere Entwickler zu senden - http://usejsdoc.org/tags-access.htmlquelle
Abgesehen von Datenschutzkonventionen wollte ich auch dazu beitragen, das Bewusstsein dafür zu schärfen, dass das Unterstrichpräfix auch für Argumente verwendet wird, die von unabhängigen Argumenten abhängig sind, insbesondere in URI-Ankerkarten. Abhängige Schlüssel zeigen immer auf eine Karte.
Beispiel (von https://github.com/mmikowski/urianchor ):
Der URI-Anker im Browser-Suchfeld wird geändert in:
Dies ist eine Konvention, die verwendet wird, um einen Anwendungsstatus basierend auf Hash-Änderungen zu steuern.
quelle
import/export
macht jetzt den Job mit ES6. Ich neige immer noch dazu, nicht exportierten Funktionen ein Präfix voranzustellen,_
wenn die meisten meiner Funktionen exportiert werden.Wenn Sie nur eine Klasse exportieren (wie in eckigen Projekten), wird diese überhaupt nicht benötigt.
quelle