TypeError: "x" is read-only
Ngoại lệ JavaScript strict mode "is read-only" xảy ra khi một biến toàn cục hoặc thuộc tính đối tượng được gán giá trị là thuộc tính chỉ đọc.
Thông báo
TypeError: Cannot assign to read only property 'x' of #<Object> (V8-based) TypeError: "x" is read-only (Firefox) TypeError: Attempted to assign to readonly property. (Safari)
Loại lỗi
TypeError chỉ trong strict mode.
Điều gì đã xảy ra?
Biến toàn cục hoặc thuộc tính đối tượng được gán giá trị là thuộc tính chỉ đọc. (Về mặt kỹ thuật, đây là thuộc tính dữ liệu không thể ghi.)
Lỗi này chỉ xảy ra trong code strict mode. Trong code non-strict, việc gán giá trị bị bỏ qua một cách im lặng.
Ví dụ
>Các trường hợp không hợp lệ
Các thuộc tính chỉ đọc không phổ biến lắm, nhưng chúng có thể được tạo bằng cách sử dụng Object.defineProperty() hoặc Object.freeze().
"use strict";
const 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");
const frozenArray = Object.freeze([0, 1, 2]);
frozenArray[0]++; // TypeError
Cũng có một số thuộc tính chỉ đọc được tích hợp sẵn trong JavaScript. Có thể bạn đã thử định nghĩa lại một hằng số toán học.
"use strict";
Math.PI = 4; // TypeError
Xin lỗi, bạn không thể làm điều đó.
Biến toàn cục undefined cũng là chỉ đọc, vì vậy bạn không thể im lặng lỗi "undefined is not a function" nổi tiếng bằng cách làm điều này:
"use strict";
undefined = function () {}; // TypeError: "undefined" is read-only
Các trường hợp hợp lệ
"use strict";
let obj = Object.freeze({ name: "Score", points: 157 });
obj = { name: obj.name, points: 0 }; // thay thế bằng một đối tượng mới