TypeError: setting getter-only property "x"
Die in strict mode vorkommende JavaScript-Ausnahme "setting getter-only property" tritt auf, wenn versucht wird, einem Eigenschaftswert einen neuen Wert zuzuweisen, für den nur ein getter definiert ist, oder wenn eine private accessor-Eigenschaft gesetzt wird, die ebenfalls nur einen Getter hat.
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
in strict mode nur.
Was ist schiefgelaufen?
Es wird versucht, einer Eigenschaft, für die nur ein getter definiert ist, einen neuen Wert zuzuweisen. Während dies im nicht-strengen Modus stillschweigend ignoriert wird, löst es im strict mode einen TypeError
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 kein setter definiert, daher wird ein TypeError
ausgelöst, wenn versucht wird, die temperature
-Eigenschaft auf 30
zu setzen. Für weitere Details siehe auch die Seite Object.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 Zeile arc.temperature = 30
, die versucht, die temperature-Eigenschaft zu setzen, entfernen oder einen setter 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 }]