admin管理员组文章数量:1417070
Here are a few examples.
// 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!'
I think Object.create()
just gives both makes both point to the same prototype, while assignment makes both object point to same location(not just prototype).
But then why is the data object being overwritten in case 3?
Here are a few examples.
// 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!'
I think Object.create()
just gives both makes both point to the same prototype, while assignment makes both object point to same location(not just prototype).
But then why is the data object being overwritten in case 3?
3 Answers
Reset to default 6Because Object.create()
only creates a shallow copy, nested objects are still referenced and not copied deeply, see 15.2.3.5 (Object.create()
) and 15.2.2.1 (new Object()
).
If you want to clone an object entirely have a look at How do I correctly clone a JavaScript object? and similar questions.
var obj2 = Object.create(obj1)
creates an empty(!) object with obj1 as its prototype.
obj2.msg = "Hi!"
adds(!) the property msg to obj2.
obj2.data.msg = "Hi!"
looks for the property data on obj2, but obj2 is empty. So it looks for the property data on the prototype of obj2, which happens to be obj1. Then it changes msg on obj1.data to "Hi".
This is happening because of the way in which java script sets and retrieves properties.For getting a property it looks up the prototype chain while for setting it sets at the most local object.
In the case 2 that is why it does not override.It sets the msg property at obj2.In case 3 It fetches the data object in the parent object and sets the property there.Hence it is overridden.In case 1 they are both referring to same object
版权声明:本文标题:javascript - What is the difference between using Object.create() and using assignment operator? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745257778a2650205.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论