未捕获的类型错误:无法分配给只读属性
我尝试了 Nicholas Zakas 所著的《面向 Web 开发人员的专业 JavaScript》一书中的这个非常简单的示例,但我不知道我在这里做错了什么。一定是我错过了一些非常简单的东西,但我被卡住了。
这是代码:
'use strict';
var book = {};
Object.defineProperties(book, {
originYear: {
value: 2004,
writable: false
},
_year: {
value: 2004
},
edition: {
value: 1
},
year : {
get: function() {
return this._year;
},
set: function(newValue) {
if(newValue > this.originYear) {
this._year = newValue;
this.edition += newValue - this.originYear;
}
}
}
});
console.log(book.edition);
book.year = 2006;
console.log(book.edition);
我在 Chrome 控制台上收到的错误是:
Uncaught TypeError: Cannot assign to read only property '_year' of #main.js:31 Object.defineProperties.year.setmain.js:39 (anonymous function)
有人可以解释一下我哪里出错了吗?
这是 fiddle
当您使用
Object.defineProperties
时,默认情况下
writable
设置为
false
,因此
_year
和
edition
实际上是
只读
属性。
明确将它们设置为
writable: true
:
_year: {
value: 2004,
writable: true
},
edition: {
value: 1,
writable: true
},
查看 此方法的 MDN 。
writable
true
if and only if the value associated with the property may be changed with an assignment operator.
Defaults tofalse
.
我在 Nextjs React 设置中遇到了这个问题。如果我触发了状态设置函数,它会在重新渲染时发生(触发 onClick 函数),但如果我直接加载页面或通过刷新加载页面,则不会发生。 在修改参数之前复制不可编辑的(在我的情况下是“冻结的”)对象,这为我解决了这个问题。 我通过 json 传递了一个对象,然后尝试设置它的一些其他属性。
book = {...book}
book.year = 2006;
我自己的设置看起来更像这样,
let linkStyle={}
if (appearance.LinkStyle) {
linkStyle = apperance.LinkStyle
}
linkStyle.color = appearance.primaryColor // Same Error here
已解决
let linkStyle={}
if (appearance.LinkStyle) {
linkStyle = {...apperance.LinkStyle}
}
linkStyle.color = appearance.primaryColor
如果有时 链接 !将不起作用。 因此,创建一个临时对象并从可写对象中获取所有值,然后更改该值并将其分配给可写对象。它应该完美。
var globalObject = {
name:"a",
age:20
}
function() {
let localObject = {
name:'a',
age:21
}
this.globalObject = localObject;
}