TypeError: setting getter-only property "x"

Ngoại lệ JavaScript chỉ xảy ra trong chế độ strict "setting getter-only property" xảy ra khi có nỗ lực đặt giá trị mới cho một thuộc tính chỉ có getter được chỉ định, hoặc khi đặt thuộc tính accessor private tương tự chỉ có getter được định nghĩa.

Thông báo

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)

Loại lỗi

TypeError chỉ trong chế độ strict.

Điều gì đã xảy ra?

Có nỗ lực đặt giá trị mới cho một thuộc tính chỉ có getter được chỉ định. Mặc dù điều này sẽ bị bỏ qua trong chế độ non-strict, nó sẽ ném TypeError trong chế độ strict. Các lớp luôn ở chế độ strict, vì vậy việc gán cho một phần tử private chỉ có getter luôn ném lỗi này.

Ví dụ

Thuộc tính không có setter

Ví dụ dưới đây cho thấy cách đặt getter cho một thuộc tính. Nó không chỉ định setter, vì vậy TypeError sẽ được ném khi cố gắng đặt thuộc tính temperature thành 30. Để biết thêm chi tiết, xem trang 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"

Để sửa lỗi này, bạn cần xóa dòng arc.temperature = 30 đang cố đặt thuộc tính temperature, hoặc bạn cần triển khai setter cho nó, ví dụ như sau:

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

Xem thêm