Fehlermeldung
TypeError: "x" is read-only (Firefox) TypeError: 0 is read-only (Firefox) TypeError: Cannot assign to read only property 'x' of #<Object> (Chrome) TypeError: Cannot assign to read only property '0' of [object Array] (Chrome)
Fehlertyp
Was ist falsch gelaufen?
Die globale Variable oder Objekteigenschaften werden als nur lesbare Eigenschaften definiert (technisch wird das mit der writable
Eigenschaft erreicht).
Der Fehler tritt nur im strict mode auf. Im normalen Modus wird eine Zuweisung still ignoriert.
Beispiele
Nicht valide Fälle
Nur lesbare Eigenschaften sind nicht sehr weit verbreitet, aber sie können mit Object.defineProperty()
oder Object.freeze()
erstellt werden.
'use strict';
var 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';
var frozenArray = Object.freeze([0, 1, 2]);
frozenArray[0]++; // TypeError
Zudem gibt es ein paar standard Eigenschaft in JavaScript, die nicht überschrieben werden können. Da währen zum Beispiel mathematische Konstanten.
'use strict';
Math.PI = 4; // TypeError
Die globale Variable undefined
ist auch nur lesbar, sodass der berüchtigte Fehler "undefined is not a function" nicht wie folgt umgangen werden kann:
'use strict';
undefined = function() {}; // TypeError: "undefined" is read-only
Valide Fälle
'use strict';
var obj = Object.freeze({name: 'Score', points: 157});
obj = {name: obj.name, points: 0}; // replacing it with a new object works
'use strict';
var LUNG_COUNT = 2; // a `var` works, because it's not read-only
LUNG_COUNT = 3; // ok (anatomically unlikely, though)