TypeError: Einstellung der nur-Getter-Eigenschaft "x"

Die JavaScript-Strict-Mode-Only-Ausnahme "Einstellung der nur-Getter-Eigenschaft" tritt auf, wenn versucht wird, einer Eigenschaft, für die nur ein Getter angegeben ist, einen neuen Wert zuzuweisen oder wenn eine private Eigenschaft gesetzt wird, die ebenfalls nur einen definierten 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)

Fehlertyp

Was ging schief?

Es wird versucht, einer Eigenschaft, für die nur ein Getter angegeben ist, einen neuen Wert zuzuweisen. Während dies im nicht-strikten Modus stillschweigend ignoriert wird, wirft es im Strict-Mode einen TypeError. Klassen sind immer im Strict-Mode, daher führt das Zuweisen zu einer nur-Getter-privaten Eigenschaft immer zu diesem Fehler.

Beispiele

Eigenschaft ohne Setter

Das folgende Beispiel zeigt, wie ein Getter für eine Eigenschaft festgelegt wird. Es wird kein Setter angegeben, daher wird ein TypeError geworfen, wenn versucht wird, die temperature-Eigenschaft auf 30 zu setzen. Weitere Details finden Sie auch auf der Seite Object.defineProperty().

js
"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 entfernen, die versucht, die temperature-Eigenschaft zu setzen, oder Sie müssen einen Setter dafür implementieren, zum Beispiel so:

js
"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 }]

Siehe auch