TypeError: "x" ist schreibgeschützt

Die JavaScript-strict mode-only Ausnahme "ist schreibgeschützt" tritt auf, wenn einer globalen Variable oder einem Objekteigenschaft ein schreibgeschützter Wert zugewiesen wurde.

Meldung

TypeError: Cannot assign to read only property 'x' of #<Object> (V8-based)
TypeError: "x" is read-only (Firefox)
TypeError: Attempted to assign to readonly property. (Safari)

Fehlertyp

Was ist schiefgelaufen?

Der globalen Variable oder der Objekteigenschaft, der zugewiesen wurde, ist eine schreibgeschützte Eigenschaft. (Technisch gesehen ist es eine nicht-schreibbare Dateneigenschaft.)

Dieser Fehler tritt nur im strict mode code auf. In nicht-strict code wird die Zuweisung stillschweigend ignoriert.

Beispiele

Ungültige Fälle

Schreibgeschützte Eigenschaften sind nicht sehr häufig, können aber mit Object.defineProperty() oder Object.freeze() erstellt werden.

js
"use strict";
const obj = Object.freeze({ name: "Elsa", score: 157 });
obj.score = 0; // TypeError

("use strict");
Object.defineProperty(this, "LUNG_COUNT", { value: 2, writable: false });
LUNG_COUNT = 3; // TypeError

("use strict");
const frozenArray = Object.freeze([0, 1, 2]);
frozenArray[0]++; // TypeError

Es gibt auch einige schreibgeschützte Eigenschaften, die in JavaScript eingebaut sind. Vielleicht haben Sie versucht, eine mathematische Konstante neu zu definieren.

js
"use strict";
Math.PI = 4; // TypeError

Entschuldigung, das können Sie nicht tun.

Die globale Variable undefined ist ebenfalls schreibgeschützt, sodass Sie den berüchtigten Fehler "undefined is not a function" nicht durch Folgendes unterdrücken können:

js
"use strict";
undefined = function () {}; // TypeError: "undefined" is read-only

Gültige Fälle

js
"use strict";
let obj = Object.freeze({ name: "Score", points: 157 });
obj = { name: obj.name, points: 0 }; // replacing it with a new object works

Siehe auch