You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:TypeError: object is not extensible错误(无法修改对象属性)

解决TypeError: Cannot add property newField, object is not extensible问题

这个错误的核心原因很明确:你从Redux store中获取的filterList.filter里的对象是**被冻结(不可扩展/修改)**的。Redux为了保证状态的不可变性,会自动冻结返回的状态对象——哪怕你用[...this.filterList.filter]做了数组的浅拷贝,数组里的每个元素还是指向原来的冻结对象,所以直接修改x.design_type会触发这个报错。

你之前尝试的方案没生效,大概率是因为那是针对普通不可扩展对象的处理,而Redux返回的是被深度冻结的对象,需要先把它转换成可修改的普通对象。

具体修复步骤

把数组浅拷贝改成深拷贝每个对象,这样每个元素都会变成独立的可修改对象:

// 替换原来的this.dynamicFilter = [...this.filterList.filter];
this.dynamicFilter = this.filterList.filter.map(item => JSON.parse(JSON.stringify(item)));

// 之后再执行修改操作就不会报错了
this.dynamicFilter.forEach((x) => {
  if (x.design_type == 'checkbox') {
    x.design_type = 'sadas';
  }
});

其他可选方案

如果你不想用JSON.parse(JSON.stringify())(它有不能处理函数、Symbol等类型的局限性),可以用:

  • 结构化克隆:structuredClone(item)(现代浏览器支持)
  • Lodash的cloneDeep方法(需要引入lodash库)

额外说明

Redux的状态不可变性是它的核心设计之一,所以永远不要直接修改从store中获取的状态对象——正确的做法就是像上面这样,先创建一个可修改的副本,再对副本进行操作。

内容的提问来源于stack exchange,提问作者cakePHP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:57:54