Spec-Zone.ru › JavaScript

TypeError: установка свойства только для чтения "x"

Исключение JavaScript строгого режима "setting getter-only property" возникает при попытке присвоить новое значение свойству, для которого указан только геттер, или при установке приватного свойства доступа, которое также имеет только определенный геттер.

Сообщение

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)

Тип ошибки

TypeError только в строгом режиме.

Что пошло не так?

Была предпринята попытка присвоить новое значение свойству, для которого указан только геттер. В нестрогом режиме это будет проигнорировано без ошибок, но в строгом режиме вызовет TypeError. Классы всегда работают в строгом режиме, поэтому присвоение значения приватному элементу, доступному только через геттер, всегда вызывает эту ошибку.

Примеры

Свойство без сеттера

В приведенном ниже примере показано, как задать геттер для свойства. Он не указывает сеттер, поэтому при попытке присвоить значение 30 свойству temperature будет выброшен TypeError. Для получения дополнительной информации обратитесь также к странице 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"

Чтобы исправить эту ошибку, вам нужно либо удалить строку arc.temperature = 30, которая пытается установить свойство temperature, либо реализовать для него сеттер, например, так:

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

См. также

  • Object.defineProperty()
  • Object.defineProperties()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API