有两段代码:
var obj1 = {name:'one'};
obj2 = Object.create(obj1);
obj2.name = 'two';
console.log(obj1.name); //one
var obj1 = {prop:{name:'one'}};
obj2 = Object.create(obj1);
obj2.prop.name = 'two';
console.log(obj1.prop.name); //two
为什么第2条的输出是两个?
答案 0 :(得分:0)
基本上,您使用obj1
作为原型。当它被使用时,它会执行对象的浅副本。这意味着顶级是不同的(即,如果您更改obj2.prop
,它将不会影响obj1.prop
,但较低级别是对相同事物的引用,因此更改它们会导致事情发生变化
与Object.assign()
:
// Shallow-copy of one level, don't affect each other
const obj1 = { a: 1 };
const obj2 = Object.assign({}, obj1);
obj2.a = 2;
console.log(obj1.a, obj2.a);
// Shallow-copy, change top-level, don't affect each other
const obj3 = { a: { b: 1 } };
const obj4 = Object.assign({}, obj3);
obj4.a = 3;
console.log(obj3.a, obj4.a);
// Shallow-copy, change inner object, affects each other
const obj5 = Object.assign({}, obj3);
obj5.a.b = 2;
console.log(obj3.a.b, obj5.a.b);
如果您想避免使用多级别的内容进行更改,则需要进行深层复制/克隆。
(有很多不同的库可以实现这样的功能,所以我不会在这里重新实现。)