set
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Die set-Syntax bindet eine Objekteigenschaft an eine Funktion, die aufgerufen wird, wenn versucht wird, dieser Eigenschaft einen Wert zuzuweisen. Sie kann auch in Klassen verwendet werden.
Probieren Sie es aus
const language = {
set current(name) {
this.log.push(name);
},
log: [],
};
language.current = "EN";
language.current = "FA";
console.log(language.log);
// Expected output: Array ["EN", "FA"]
Syntax
{ set prop(val) { /* … */ } }
{ set [expression](val) { /* … */ } }
Es gelten einige zusätzliche Syntaxbeschränkungen:
- Ein Setter muss genau einen Parameter haben.
Parameter
prop-
Der Name der Eigenschaft, die an die angegebene Funktion gebunden werden soll. Wie bei anderen Eigenschaften in Objektinitialisierern kann dies ein String-Literal, ein Zahlenliteral oder ein Bezeichner sein.
val-
Ein Alias für die Variable, die den Wert enthält, der
propzugewiesen werden soll. expression-
Sie können auch Ausdrücke für einen berechneten Eigenschaftsnamen verwenden, um ihn an die angegebene Funktion zu binden.
Beschreibung
In JavaScript kann ein Setter verwendet werden, um eine Funktion auszuführen, sobald versucht wird, den Wert einer Eigenschaft zu ändern. Setter werden meist zusammen mit Gettern verwendet.
Eine Objekteigenschaft ist entweder eine Dateneigenschaft oder eine Accessor-Eigenschaft, kann aber nicht beides zugleich sein. Weitere Informationen finden Sie unter Object.defineProperty(). Mit der Setter-Syntax können Sie die Setter-Funktion in einem Objektinitialisierer angeben.
const obj = {
set prop(val) {
// setter, the code executed when setting obj.prop
},
};
Eigenschaften, die mit dieser Syntax definiert werden, sind eigene Eigenschaften des erstellten Objekts. Sie sind konfigurierbar und aufzählbar.
Beispiele
>Einen Setter für neue Objekte in Objektinitialisierern definieren
Das folgende Beispiel definiert eine Pseudoeigenschaft current des Objekts language. Wenn current ein Wert zugewiesen wird, wird log mit diesem Wert aktualisiert:
const language = {
set current(name) {
this.log.push(name);
},
log: [],
};
language.current = "EN";
console.log(language.log); // ['EN']
language.current = "FA";
console.log(language.log); // ['EN', 'FA']
Beachten Sie, dass current keinen Getter hat. Jeder Versuch, auf die Eigenschaft zuzugreifen, ergibt undefined.
Setter in Klassen verwenden
Mit genau derselben Syntax können Sie öffentliche Instanz-Setter definieren, die auf Klasseninstanzen verfügbar sind. In Klassen benötigen Sie zwischen Methoden kein Komma als Trennzeichen.
class ClassWithGetSet {
#msg = "hello world";
get msg() {
return this.#msg;
}
set msg(x) {
this.#msg = `hello ${x}`;
}
}
const instance = new ClassWithGetSet();
console.log(instance.msg); // "hello world"
instance.msg = "cake";
console.log(instance.msg); // "hello cake"
Setter-Eigenschaften werden auf der Eigenschaft prototype der Klasse definiert und somit von allen Instanzen der Klasse gemeinsam genutzt. Anders als Setter-Eigenschaften in Objektliteralen sind Setter-Eigenschaften in Klassen nicht aufzählbar.
Statische Setter und private Setter verwenden ähnliche Syntaxformen. Diese werden auf den Seiten zu static und privaten Elementen beschrieben.
Einen Setter mit dem Operator delete entfernen
Wenn Sie den Setter entfernen möchten, können Sie ihn einfach mit delete löschen:
delete language.current;
Einen Setter für bestehende Objekte mit defineProperty definieren
Um einem bestehenden Objekt einen Setter hinzuzufügen, verwenden Sie Object.defineProperty().
const o = { a: 0 };
Object.defineProperty(o, "b", {
set(x) {
this.a = x / 2;
},
});
o.b = 10;
// Runs the setter, which assigns 10 / 2 (5) to the 'a' property
console.log(o.a); // 5
Einen berechneten Eigenschaftsnamen verwenden
const expr = "foo";
const obj = {
baz: "bar",
set [expr](v) {
this.baz = v;
},
};
console.log(obj.baz); // "bar"
obj.foo = "baz";
// Run the setter
console.log(obj.baz); // "baz"
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-method-definitions> |
Browser-Kompatibilität
Siehe auch
- Arbeiten mit Objekten – Leitfaden
- Funktionen
getObject.defineProperty()- Objektinitialisierer
class- Eigenschaftszugriff
- Inkompatible Änderung in ES5: Getter- und Setter-Funktionen in Literalen müssen nun genau null beziehungsweise ein Argument haben von Jeff Walden (2010)
- Weitere Änderungen an SpiderMonkey: Eine alte, selten verwendete Syntax zum Erstellen von Gettern und Settern wird entfernt von Jeff Walden (2010)