我偶然发现了与现代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
之后,是否可以保留计算的属性?谢谢。
答案 0 :(得分:6)
如果查看由object.assign
创建的新对象的结果,您将看到它不再具有getter / setter,而是具有属性prop
。 object.assign
不会复制getter / setter函数,而是调用[[get]]
并创建一个新属性。
它在源上使用[[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);
不等同的对象。