Hallo Jo,
die aus PHP oder C++ bekannten Referenzen auf beliebige Variablen gibt es in JavaScript nicht.
Aber vielleicht kannst Du Dich mit einem selbstgebaunten Funktor[1] behelfen?
let SomeClass = function() {
this.a = 17;
};
let makeRefFunctor = function (obj, property) {
return function(newValue) {
return (arguments.length > 0) ?
(obj[property] = newValue) :
obj[property];
}
}
let obj = new SomeClass();
let refA = makeRefFunctor(obj, "a");
console.log(refA());
refA(32);
console.log(refA());
SomeClass ist eine beliebige Klasse mit der Eigenschaft a.
makeReference erzeugt eine anonyme Funktion, die einen optionalen Parameter newValue bekommt. Da dieses Funktionsobjekt den Scope dieses makeReference-Aufrufs als Closure mitnimmt und später auch nutzt, wird es zum Funktor, der für ein bestimmtes Objekt eine bestimmte Eigenschaft lesen und schreiben kann.
Der Funktor muss eine richtige Funktion sein, keine Pfeilfunktion, damit arguments
definiert ist. Damit kann man abfragen, wieviele Parameter übergeben wurden und so steuern, ob der Funktor als getter oder setter agieren soll.
Alternativ kann man auch eine Klasse PropertyRef bauen. Die macht nichts anderes als der Funktor, speichert aber Objekt und Propertyname explizit und steuert den Zugriff über getter und setter einer Value-Eigenschaft.
class PropertyRef {
constructor(obj, property) {
this.object = obj;
this.property = property;
}
get value() { return this.object[this.property]; }
set value(newValue) { this.object[this.property] = newValue; }
}
let obj = new SomeClass();
let pRefA = new PropertyRef(obj, "a");
console.log(pRefA.value);
pRefA.value = 47;
console.log(pRefA.value);
Rolf
sumpsi - posui - clusi
Definition Funktor in C++: Ein Objekt, das den Operator
()
überlädt. Letztlich ist das in JavaScript für jede Funktion der Fall; ein Funktor hat aber im Gegensatz zu einer normalen Funktion die Möglichkeit, sich Informationen zu merken. Das verwenden wir hier. ↩︎