如何修改对象的原生属性值?调用静态修改函数后对象属性修改未持久化的问题求助
Why aren't my object property changes persisting between function calls?
看起来你遇到的问题主要有两个小细节需要调整,另外可能是测试方式导致了修改不保留的错觉,咱们一步步来解决:
1. 静态函数里的硬编码全局变量问题
先看你的changeValue静态方法——你明明把array作为参数传进去了,但函数里却直接修改了全局的shoesArray而不是传入的数组参数。虽然现在你传入的就是shoesArray,这暂时没出问题,但这是不好的编程习惯,而且如果以后想修改其他数组的话就会出错。
把函数改成这样,使用传入的array参数:
static changeValue(array, index, property, content) { // 用传入的array代替全局的shoesArray array[index][property] = content; console.table(array); }
2. 核心问题:你可能每次都在重新运行整个代码
这才是修改不保留的关键!如果你的测试方式是每次修改函数调用后,都重新运行整个代码文件,那每次运行时:
- 所有
myShoes1到myShoes5都会被重新创建成初始状态 shoesArray也会被重新填充这些全新的初始对象- 之前的修改当然会被完全覆盖,看起来就像没保留一样
正确的测试方式
你需要在同一个执行会话中完成初始化和多次修改:
- 如果是在浏览器控制台:
- 先把整个代码(除了最后那行
Shoes.changeValue(...))粘贴进去运行,完成对象和数组的初始化 - 然后单独输入第一次修改调用:
Shoes.changeValue(shoesArray, 3, "quantity", 100);,此时能看到修改生效 - 再输入第二次修改调用:比如
Shoes.changeValue(shoesArray, 0, "valuePerItem", 50);,这时候你会发现第一次的修改还在,第二次的修改也生效了
- 先把整个代码(除了最后那行
- 如果是用Node.js:
- 打开终端输入
node进入REPL交互式环境 - 粘贴你的初始化代码(对象创建、数组填充,以及类定义)
- 然后依次输入多次
changeValue调用,就能看到修改是持续保留的
- 打开终端输入
验证修改效果
现在按照正确的测试方式来,你会发现对象的修改是会被保留的——因为你没有重新初始化对象和数组,只是在同一个数组和对象上做多次修改。
举个例子,在同一个会话中执行:
// 第一次修改 Shoes.changeValue(shoesArray, 3, "quantity", 100); // 第二次修改 Shoes.changeValue(shoesArray, 3, "valuePerItem", 45);
你会看到shoesArray[3]的quantity是100,valuePerItem变成了45,两次修改都被保留了。
内容的提问来源于stack exchange,提问作者CoderInNeed




