是什么使用的Object.create(),并使用赋值运算符之间的区别?(What is the d

2019-08-17 10:27发布

这里有一些例子。

// case 1:
var obj1 = {msg : 'Hello'};
var obj2 = obj1;
obj2.msg = "Hi!"; //overwrites
alert(obj1.msg); //=>'Hi!'

// case 2:
var obj1 = {msg : 'Hello'};
var obj2 = Object.create(obj1);
obj2.msg = "Hi!"; //does not overwrite
alert(obj1.msg); //=>'Hello'

// case 3:
var obj1 = {data: { msg : 'Hello'}}
var obj2 = Object.create(obj1);
obj2.data.msg = "Hi!"; //overwrites, Why?
alert(obj1.data.msg); //=>'Hi!'

我认为Object.create()只是给双方做都指向相同的原型,而分配使得两个对象都指向同一个位置(而不仅仅是原型)。 但后来为什么是数据对象被的情况下,3改写了?

Answer 1:

var obj2 = Object.create(obj1)与OBJ1作为其原型创建一个空的(!)对象。

obj2.msg = "Hi!" 添加(!)的财产味精OBJ2。

obj2.data.msg = "Hi!" 将查找obj2的属性数据,但obj2的是空的。 因此,它看起来对原型OBJ 2的,这恰好是OBJ1属性数据。 然后,它改变了上obj1.data味精为“Hi”。



Answer 2:

由于Object.create()只创建了一个浅拷贝,嵌套的对象仍是参考,而不是深复制,见15.2.3.5 ( Object.create()和15.2.2.1 ( new Object()

如果你想克隆对象完全看一下如何正确地克隆JavaScript对象? 和类似的问题。



Answer 3:

这是因为其中的Java脚本设置并检索properties.For得到它查找原型链而设置它设置在最本地对象属性的方式发生。

在外壳2中,这就是为什么它不override.It设置在obj2.In壳体3它获取在父对象中的数据对象的属性MSG和设置属性there.Hence它overridden.In壳体1它们都指对同一个对象



文章来源: What is the difference between using Object.create() and using assignment operator?