ZBLOG

function deepProxy(target, path = []) { const changedValues = {}; const handler = (path) => ({ set: function (obj, prop, value) { console.log(`属性 ${prop} 被设置为 ${value}`); obj[prop] = valu

在你的代码中,当对数组进行修改时,使用了obj.slice()来获取新的数组,但是这样得到的新数组并不会包含最后一次修改的值。因为slice()方法只是返回了原始数组的一个浅拷贝,并没有包含新加入或者被删除的元素。

所以,在处理数组修改时,你需要手动将修改后的值添加进新生成的数组中,而不是直接使用slice()方法来获取新数组。以下是修复后的代码:

const arrayHandler = (path) => ({
  set: function(obj, prop, value) {
    console.log(`属性 ${prop} 被设置为 ${value}`);
    obj[prop] = value;
    if (!isNaN(prop)) {
      const newArray = [];
      for (let i = 0; i < obj.length; i++) {
        newArray[i] = obj[i];
      }
      newArray[prop] = value;
      setChangedValue(changedValues, [...path, prop], newArray);
    }
    return true;
  },
  get: function(obj, prop) {
    if (typeof obj[prop] === "object" && obj[prop] !== null) {
      // 处理数组
      if (Array.isArray(obj[prop])) {
        return new Proxy(obj[prop], arrayHandler([...path, prop]));
      }
      // 处理对象
      return new Proxy(obj[prop], handler([...path, prop]));
    }
    return obj[prop];
  },
});

在这个修复后的代码中,我们创建了一个新数组newArray来存储修改后的结果。首先将原始数组所有元素复制到该新数组中,然后将修改的元素添加到新数组中。最后将新数组作为修改后的值传递给setChangedValue()方法。

这样,我们就可以得到预期结果了。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=5354

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?