【问题标题】:Why are the returned data the same?为什么返回的数据是一样的?
【发布时间】:2017-08-25 06:36:40
【问题描述】:

let statList = {
  title: {
    x: "center"
  },
  xAxis: {
    type: "category",
    axisTick: {
      alignWithLabel: true
    }
  },
  yAxis: {
    type: "value"
  }
};

let statObj = {};

statObj.chatObj = Object.create(statList);
statObj.carObj = Object.create(statList);
statObj.saObj = Object.create(statList);

statObj.chatObj.xAxis.data = [1, 2, 3];
statObj.carObj.xAxis.data = [4, 5, 6];
statObj.saObj.xAxis.data = [7, 8, 9];

console.log(statObj)

为什么返回的statObj.XX.xAxis.data是一样的?

为什么当我使用console.log(JSON.stringify(statObj))时,结果是{"chatObj":{},"carObj":{},"saObj":{}}

【问题讨论】:

  • 试试这个:alert((statObj.chatObj === statList));这将告诉您是否已创建 statList 的副本,或者实际上它只是对 statList 的引用,这将解释为什么它们是相同的。

标签: javascript json node.js


【解决方案1】:

虽然设置statObj.chatObj.xAxisxAxischatObj上找不到,所以在原型链上搜索xAxisstatListchatObj的原型),我们可以在那里找到它。到目前为止,我们已经完成了statObj.chatObj.xAxis 部分,接下来我们将创建一个.data 密钥,它将在statList.xAxis 上创建。 statObj.carObj.xAxis.datastatObj.saObj.xAxis.data 的赋值覆盖了statObj.chatObj.xAxis.datastatList.xAxis.data 上设置的内容,这就是为什么我们得到statObj.XX.xAxis.data 的结果,最后一个设置值是[7, 8, 9]

【讨论】:

    【解决方案2】:

    通常我会使用以下技巧来解决这个问题

    statObj.chatObj = JSON.parse(JSON.stringify(statList));
    

    我并不是说这是一个好习惯,但通过这种方式我可以确保创建的对象在内存中有它自己的地址。

    Object.assign() 的问题在于它不适用于嵌套属性,无论如何创建的对象都是可变的。

    【讨论】:

    • 这也是我一直以来的做法。由于堆栈溢出,我才知道还有其他方法。实际上这个问题是我第一次看到'Object.create'!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2022-01-22
    • 2014-11-15
    相关资源
    最近更新 更多