ich arbeite an einem kleinen Tool und mir wird gerade klar, wie doof das ist, dass es in JS keine richtige Privatisierung gibt.
Richtig, JavaScript kennt keine Gültigkeitsbeschränkungen auf Klassen- oder Objekt-Ebene. Datenkapselung erfolgt stattdessen durch den lexikalischen Scope. Für Programmierer mit klassischer objektorientierter Vorbelastung ist das gewöhnungsbedürftig, war es für mich anfangs auch. Aber mit der Zeit habe ich diese Trennung zwischen Datenkapselung und Objektorientierung wirklich schätzen gelernt. Es ist eine sinnvolle konzeptionelle Unterscheidung. Inzwischen kommt mit sogar die Vermengung von Datenkapselung und Objektorientierung, wie zum Beispiel in Java, ziemlich verkorkst vor.
Sehe ich das richtig, dass eine „Privatisierung“ der Methode
reverse
nur durch die oben gezeigten Varianten zu erreichen ist? Wenn Ja, welche ist zu bevorzugen? Wenn Nein, wie geht es besser?
In modernem JavaScript würdest du vermutlich Symbols verwenden wollen. Symbols sind neben Strings, die einzigen Datentypen, die als Schlüssel für Objekteigenschaften verwendet werden können. Anders als Strings haben sie die Eigenschaft einzigartig zu sein: Jeder Aufruf von "Symbol()" erzeugt ein neues Symbol, das von allen anderen Symbols verschieden ist. Sie führen kein neues Konzept für Datenkapselung ein, aber der Programmierer kann sie in Verbindung mit dem lexikalischen Scope zum Beispiel für private Member-Variablen nutzen.
const privateLog = Symbol();
export class MyClass {
[privateLog](msg) {
console.log(msg);
},
publicLog (msg) {
this[privateLog](msg);
}
}
Code, der diese Klasse importiert, erhält keinen Zugriff auf die private Methode, weil er das Symbol "privateLog" nicht kennt, weil es von dem Modul nicht exportiert wird [1]. Das ist ein sehr einfaches Beispiel, in der Praxis kann ein Programmierer die Granularität der Datenkapselung sehr viel freier nach seinen eigenen Wünschen gestalten und ist nicht auf bestimmte Berechtigungsstufen wie "private", "protected" und "public" beschränkt.
Es gibt theoretisch eine globale Registry, in der der importierende Code, das Symbol nachschlagen könnte. Aber die Gefahr von versehentlicher Kollision ist damit gebannt. ↩︎