Reinhard: Private Klassen-Eigenschaften

Beitrag lesen

Hey,

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 MyClass {
  [privateLog](msg) {
     console.log(msg);
  },
  publicLog (msg) {
     this[privateLog](msg);
  }
}

Ich weiß nicht, wie „private Member-Variablen“ definiert sind, aber vollkommen private sind auch Symbols nicht:

var expo = (function() {
    var reverseSym = Symbol();
    var myClass = function(msg) {
        this.msg = msg;
    };
    myClass.prototype.alert = function() {
        window.alert(this[reverseSym]());
    };
    myClass.prototype[reverseSym] = function() {
        return this.msg.split('').reverse().join('');
    };
    return myClass;
})();
var sym = Object.getOwnPropertySymbols(expo.prototype)[0];
var reversed = expo.prototype[sym].call({ msg : 'my hello world' });

Aber in gewisser Weise hast du schon recht. Dafür ist schon recht viel Know-How nötig, sodass man davon ausgehen kann, dass niemand „versehentlich“ eine Funktion aufruft, die er eigentlich nicht aufrufen können sollte. Sogesehen sind Symbols eine – in objektorientierter Hinsicht – elegante Alternative.

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.

Object.getOwnPropertySymbols(obj) macht's möglich, s.o.

Reinhard