使用Object.create()和Object.assign()创建对象有什么区别?

时间:2016-01-17 12:27:49

标签: javascript object-create

考虑以下代码:

var obj1 = Object.create({}, {myProp: {value: 1}});
var obj2 = Object.assign({}, {myProp: 1});

obj1obj2之间是否存在差异,因为每个对象都是以不同的方式创建的?

4 个答案:

答案 0 :(得分:24)

让我们在此代码中比较obj1obj2

var target1 = {}, target2 = {};
var obj1 = Object.create(target1, {myProp: {value: 1}});
var obj2 = Object.assign(target2, {myProp: 1});

原型链

Object.create使用指定的[[Prototype]]创建一个新对象,Object.assign直接在指定对象上分配属性:

obj1 !== target1;
obj2 === target2;

obj1obj2的原型链看起来像

obj1 --> target1 -->  Object.prototype --> null
obj2 -------------->  Object.prototype --> null

<强>属性

Object.create定义属性,Object.assign仅指定属性。

创建属性时,分配会将其创建为可配置,可写和可枚举。定义属性时,可以指定这些标志,但默认情况下,它不可配置,也不可写,也不可枚举。

Object.getOwnPropertyDescriptor(obj1, 'myProp');
  // { value: 1, writable: false, enumerable: false, configurable: false }
Object.getOwnPropertyDescriptor(obj2, 'myProp');
  // { value: 1, writable: true, enumerable: true, configurable: true }

答案 1 :(得分:0)

Object.assign()提供浅拷贝(仅属性和方法),它将覆盖声明的方法和属性。 而Object.create()提供深层复制提供原型链。

答案 2 :(得分:0)

您还可以将它们Object.assign(Object.create(object))组合在一起进行浅拷贝和深拷贝,它们在ES6中是完全有效的模式。

答案 3 :(得分:-1)

我们也可以像这样创建对象的深拷贝

var obj = {id:1, fname:'sajid', lname: 'imtiaz'};
var deepObj = Object.assign({},obj)

`