Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
TypeError: setting getter-only property "x"
Die instrict mode vorkommende JavaScript-Ausnahme "setting getter-only property" tritt auf, wenn versucht wird, einem Eigenschaftswert einen neuen Wert zuzuweisen, für den nur eingetter definiert ist, oder wenn eineprivate accessor-Eigenschaft gesetzt wird, die ebenfalls nur einen Getter hat.
In diesem Artikel
Nachricht
TypeError: Cannot set property x of #<Object> which has only a getter (V8-based)TypeError: '#x' was defined without a setter (V8-based)TypeError: setting getter-only property "x" (Firefox)TypeError: Attempted to assign to readonly property. (Safari)TypeError: Trying to access an undefined private setter (Safari)
Fehlerart
TypeError instrict mode nur.
Was ist schiefgelaufen?
Es wird versucht, einer Eigenschaft, für die nur eingetter definiert ist, einen neuen Wert zuzuweisen. Während dies im nicht-strengen Modus stillschweigend ignoriert wird, löst es imstrict mode einenTypeError aus. Klassen sind immer im strengen Modus, daher löst die Zuweisung zu einem rein lesenden privaten Element immer diesen Fehler aus.
Beispiele
>Eigenschaft ohne Setter
Das folgende Beispiel zeigt, wie ein Getter für eine Eigenschaft gesetzt wird. Es wird keinsetter definiert, daher wird einTypeError ausgelöst, wenn versucht wird, dietemperature-Eigenschaft auf30 zu setzen. Für weitere Details siehe auch die SeiteObject.defineProperty().
"use strict";function Archiver() { const temperature = null; Object.defineProperty(this, "temperature", { get() { console.log("get!"); return temperature; }, });}const arc = new Archiver();arc.temperature; // 'get!'arc.temperature = 30;// TypeError: setting getter-only property "temperature"Um diesen Fehler zu beheben, müssen Sie entweder die Zeilearc.temperature = 30, die versucht, die temperature-Eigenschaft zu setzen, entfernen oder einensetter dafür implementieren, zum Beispiel so:
"use strict";function Archiver() { let temperature = null; const archive = []; Object.defineProperty(this, "temperature", { get() { console.log("get!"); return temperature; }, set(value) { temperature = value; archive.push({ val: temperature }); }, }); this.getArchive = function () { return archive; };}const arc = new Archiver();arc.temperature; // 'get!'arc.temperature = 11;arc.temperature = 13;arc.getArchive(); // [{ val: 11 }, { val: 13 }]