javascript - 使用 Object.create() 和使用赋值运算符有什么区别?

标签 javascript ecmascript-5 prototypal-inheritance

这里有几个例子。

// 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()只是让两个对象都指向同一个原型(prototype),而赋值使两个对象指向相同的位置(不仅仅是原型(prototype))。 但是为什么在情况 3 中数据对象会被覆盖呢?

最佳答案

由于Object.create()仅创建浅拷贝,因此嵌套对象仍被引用且未深度复制,请参阅15.2.3.5 (Object.create()) 和 15.2.2.1 (new Object())。

如果你想完全克隆一个对象,请查看 How do I correctly clone a JavaScript object?和类似的问题。

关于javascript - 使用 Object.create() 和使用赋值运算符有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308545/

相关文章:

javascript - 一个线性变量声明

javascript - 在Javascript中使用Prototype有什么好处?

Javascript - 为什么这个 if 语句在控制台中打印 "Hello"两次?

javascript - jQuery 插件中的全局变量

javascript - 是否可以将 ES5 JavaScript 与 Angular 2 而不是 TypeScript 一起使用?

Javascript对象通过属性获取对象

javascript - x.__proto__ == X.prototype 并不总是与 javascript 中的 x instanceof X 相同?

javascript - 在哪里可以找到使用 Crockford 方法进行原型(prototype)继承的大型 JavaScript 项目的示例?

javascript - 如何在另一个对象的被调用函数中获取调用者引用?

javascript - 使用 React 单击时输入的值更新 URL