TypeError: setting getter-only property "x"
JavaScript 严格模式下,仅限严格模式的异常“设置仅有 getter 的属性”发生于以下情况:尝试为仅指定了 getter 的属性设置新值,或者设置同样仅定义了 getter 的私有访问器属性。
消息
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)
错误类型
哪里出错了?
此错误发生于尝试为仅指定了 getter 的属性设置新值。在非严格模式下,此操作将被静默忽略,但在严格模式下,它会抛出 TypeError。类始终处于严格模式,因此给仅有 getter 的私有元素赋值总是会抛出此错误。
示例
没有 setter 的属性
以下示例展示了如何为属性设置 getter。它没有指定 setter,因此在尝试将 temperature 属性设置为 30 时会抛出 TypeError。有关更多详细信息,请参阅 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"
要解决此错误,您需要删除尝试设置 temperature 属性的 arc.temperature = 30 行,或者您需要为它实现一个 setter,例如这样:
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 }]