开发者问题收集

未捕获的类型错误:无法分配给只读属性

2014-12-17
357623

我尝试了 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

3个回答

当您使用 Object.defineProperties 时,默认情况下 writable 设置为 false ,因此 _yearedition 实际上是 只读 属性。

明确将它们设置为 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 to false .

Leo
2014-12-17

我在 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
Greggory Wiley
2023-07-11

如果有时 链接 !将不起作用。 因此,创建一个临时对象并从可写对象中获取所有值,然后更改该值并将其分配给可写对象。它应该完美。

var globalObject = {
    name:"a",
    age:20
}
function() {
    let localObject = {
    name:'a',
    age:21
    }
    this.globalObject = localObject;
}
Ramkumar
2020-09-01