TypeError: setting a property that has only a getter
Message
TypeError: Assignment to read-only properties is not allowed in strict mode (Edge) TypeError: setting getter-only property "x" (Firefox) TypeError: Cannot set property "prop" of #<Object> which has only a getter (Chrome)
Type d'erreur
TypeError
, uniquement en mode strict.
Quel est le problème ?
On essaie de fournir une nouvelle valeur pour une propriété qui ne dispose que d'un accesseur. Ceci échouera en mode non-strict mais lèvera une exception TypeError
en mode strict.
Exemples
Dans l'exemple qui suit, on voit comment créer un accesseur sur une propriété. En revanche, dans la définition de l'objet, on n'inclut aucun mutateur et une exception TypeError
sera déclenchée lorsqu'on voudra modifier la propriété temperature
pour la passer à 30
. Pour plus de détails, on pourra consulter la page Object.defineProperty()
.
"use strict";
function Archiver() {
var temperature = null;
Object.defineProperty(this, "temperature", {
get: function () {
console.log("get!");
return temperature;
},
});
}
var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 30;
// TypeError: setting a property that has only a getter
Pour corriger cette erreur, soit on retire la ligne 16 (où on tente de modifier la propriété) soit on implémente un mutateur, comme ceci :
"use strict";
function Archiver() {
var temperature = null;
var archive = [];
Object.defineProperty(this, "temperature", {
get: function () {
console.log("get!");
return temperature;
},
set: function (value) {
temperature = value;
archive.push({ val: temperature });
},
});
this.getArchive = function () {
return archive;
};
}
var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]