dedlfix: Verständnisfrage JavaScript getter und setter

Beitrag lesen

Tach!

Wenn ich eine Methode mit get und set definiere, dann definiere ich im Grunde ja zwei Methoden mit demselben Bezeichner. Werden diese beiden darüber unterschieden, dass ich entweder ein oder mehrere Argumente übermittle, oder eben keines?

Das ist eine Frage nach den Interna der Engine. Als Verwender sieht es für dich ja nur wwie ein Variablenzugriff aus. Und das ist entweder ein lesender oder ein schreibender Zugriff. Darüber kann unterschieden werden, ob der Getter oder der Setter aufgerufen werden muss.

Und wenn dem so ist, wäre es dann nicht sinnvoll mit diesen Methoden einen Wert zu verändern, der ansonsten unerreichbar wäre (eine Variable in einer Closure, deren getter und setter dann natürlich nach dem revealing pattern erstellt werden müssten), anstatt eine Eigenschaft mit einem Bezeichner mit einer beliebigen Anzahl an Unterstrichen zu versehen?

Unterstriche sind Kosmetik und Coding Style. Es kommt ja drauf an, was du mit dem Getter/Setter bezweckst. Wenn du nur einen simplen Variablenzugriff haben möchtest, sind Getter/Setter überdimensioniert. Sie haben erst dann einen bedeutenden Vorteil, wenn du neben dem oder statt des Durchreichen(s) eines privat abgelegten Wertes noch irgendwas anderes tust, wie einen Wert zu berechnen. Zum Beispiel kann die Eigenschaft Fullname einen Getter ohne Setter haben und beim Zugriff die ansonsten einzeln gespeicherten Werte zu Vor- und Nachnamen und ein Leerzeichen zusammengebracht liefern. Ein schreibender Zugriff ist dafür weniger sinnvoll, weswegen der wegen fehlendem Setter abgelehnt wird.

Zwei Beispiele, die meine Frage veranschaulichen sollen:

const myCar = {
    _color: "red", // von außen erreichbare Eigenschaft
    get color: function () { return this._color; },
    set color: function (value) { this._color = value; },
    _type: "SUV",  // von außen erreichbare Eigenschaft
    get type: function () { return this._type; },
    set type: function (value) { this._type = value; }
};

Das sind lediglich 1:1-Durchreicher ohne gesteigerten Nutzen für den Einsatz von Gettern/Settern.

    this.color = function () { // von außen erreichbare Methode
        if (arguments.length > 0) {
            color = arguments[0]; // tut wie setter
        };

        return color; // getter: in Closure eingeschlossene Variable
    };

Ja, auf diese Weise mit nur einer Funktion und dem Prüfen ob ein Parameter übergeben wurde oder nicht, habe ich das früher auch mal (aber nicht im Javascript-Umfeld) gemacht, um Getter/Setter nachzubilden. Der Nachteil ist aber, dass du für die Prüfung auf Argumente Code einbauen musst, der nicht auf den ersten Blick selbsterklärend ist.

Es geht aber auch die Verwendung von arguments:

function foo(bar) {
  if (bar != undefined) {
    // ...
  }
}

Worum es mir geht, ist die Frage, ob ein revealing pattern in JavaScript(!) nicht sinnvoller ist, als das in anderen Sprachen eher übliche Arbeiten mit getter und setter.

Für welchen Anwendungsfall?

dedlfix.