关于Object.create()和原型链的一些麻烦?

时间:2017-06-28 14:28:54

标签: javascript ecmascript-5

有两段代码:

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条的输出是两个?

1 个答案:

答案 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);

如果您想避免使用多级别的内容进行更改,则需要进行深层复制/克隆。

(有很多不同的库可以实现这样的功能,所以我不会在这里重新实现。)