为什么Object.assign之后我的计算属性无效?

时间:2019-03-22 19:48:35

标签: javascript computed-properties

我偶然发现了与现代JavaScript类似的代码:

let obj = {
  data: {number: 9},
  set prop(p) {
    this.data = p;
  },
  get prop() {
    return this.data;
  }
};

obj = Object.assign({}, obj, {
  data: {number: 2}
});

console.log('obj.data === obj.prop ', obj.data === obj.prop);
console.log('obj.data.number === obj.prop.number ', obj.data.number === obj.prop.number);

在计算属性之外进行任何修改,就好像没有修改一样。

我希望计算的属性仍然存在。

在调用Object.assign之后,是否可以保留计算的属性?谢谢。

2 个答案:

答案 0 :(得分:6)

如果查看由object.assign创建的新对象的结果,您将看到它不再具有getter / setter,而是具有属性propobject.assign不会复制getter / setter函数,而是调用[[get]]并创建一个新属性。

MDN describes it

  

它在源上使用[[Get]],在目标上使用[[Set]],因此它将调用getter和setter。因此,它分配属性而不是仅仅复制或定义新属性。如果合并源包含getter,则可能不适合将新属性合并到原型中。

因此,assign()将具有prop属性的对象与具有data属性的对象合并在一起,您会得到:

let obj = {
  data: {
    number: 9
  },

  set prop(p) {
    this.data = p;
  },

  get prop() {
    return this.data;
  }

};

obj = Object.assign({}, obj, {
  data: {
    number: 2
  }
});

// it has a data and a prop property -- they are not the same:
console.log(obj)

答案 1 :(得分:-1)

请考虑以下内容:

let ex = {
  o: 1
}

let ex2 = {
  o: 1
}

console.log(ex === ex2);

不等同的对象。