这里有一些例子。
// 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改写了?
var obj2 = Object.create(obj1)
与OBJ1作为其原型创建一个空的(!)对象。
obj2.msg = "Hi!"
添加(!)的财产味精OBJ2。
obj2.data.msg = "Hi!"
将查找obj2的属性数据,但obj2的是空的。 因此,它看起来对原型OBJ 2的,这恰好是OBJ1属性数据。 然后,它改变了上obj1.data味精为“Hi”。
由于Object.create()
只创建了一个浅拷贝,嵌套的对象仍是参考,而不是深复制,见15.2.3.5 ( Object.create()
和15.2.2.1 ( new Object()
如果你想克隆对象完全看一下如何正确地克隆JavaScript对象? 和类似的问题。
这是因为其中的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?