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

如何设置getter返回数组中对象的属性?赋值失效问题求解

问题分析与解决方案

嘿,这个问题的核心在于你使用的getter函数每次都会返回全新的数组及对象实例,导致你做的修改根本没被保留下来!

为什么原代码不生效?

你定义的get names()每次被访问时,都会重新创建一个包含三个新对象的数组。当你执行data.names[1].name = "Yossi"时,你修改的只是这次getter调用返回的临时对象;等你下次访问data.names,getter又会生成一套全新的对象,之前的修改自然就“消失”了。

哪怕你给单个对象手动加setter也没用——因为这个带setter的对象也是每次getter调用时重新创建的,修改的依然是临时实例。

解决方案

根据你的需求,有两种常用的处理方式:

1. 直接存储数组(不需要getter)

如果不需要动态生成names数组,直接把数组作为data的属性即可,这样每次访问data.names都是同一个数组实例:

var data = { 
  names: [ 
    { name: "name1" }, 
    { name: "name2" }, 
    { name: "name3" }, 
  ] 
} 
data.names[1].name = "Yossi"; 
console.log(data.names[1]); // 输出 { name: "Yossi" }

2. 缓存数组实例(保留getter的同时复用数组)

如果必须使用getter(比如需要在某些时机动态更新数组,但平时要复用实例),可以把数组存在私有属性中,让getter返回这个固定的实例:

var data = {
  // 用下划线标记私有属性(约定俗成)
  _names: [ 
    { name: "name1" }, 
    { name: "name2" }, 
    { name: "name3" }, 
  ],
  get names() {
    return this._names; // 每次都返回同一个数组实例
  }
}
data.names[1].name = "Yossi";
console.log(data.names[1]); // 正确输出修改后的对象

如果你的场景确实需要每次getter都生成新数组,但要保留修改,那可能需要额外的逻辑同步修改到源数据(比如使用Proxy代理数组对象),不过这种情况比较少见,上面两种方案基本能覆盖大多数场景啦!

内容的提问来源于stack exchange,提问作者Yuval A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:58:28