Felix Riesterer: Verständnisfrage JavaScript getter und setter

Beitrag lesen

Liebe JavaScript-Experten, lieber @Rolf b

ich habe im Wiki ein bisschen gestöbert (schaue oft nach aktuellen Änderungen) und Rolfs Benutzerseite zu JavaScript-Objekten gefunden. Da habe ich dann zu getter und setter gelesen und prompt ein paar Fragen.

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? 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?

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; }
};

function AnyonesCar () {
    var color, type;  // von außen unerreichbare Variablen

    if (arguments.length > 0) {
        type = arguments[0];
    }

    if (arguments.length > 1) {
        color = arguments[1];
    }

    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
    };

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

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

const yourCar = AnyonesCar("station wagon", "green");

Mir ist nicht bekannt, inwiefern man aus einem Objektliteral einen Konstruktor machen könnte - aber das hat sicher mit Cloning zu tun (vielleicht mit const myOtherCar = new Object(myCar)?).

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.

Liebe Grüße,

Felix Riesterer.