What is difference between creating object using Object.create() and Object.assign()?

前端 未结 3 1349
春和景丽
春和景丽 2020-12-13 09:49

Considering following code:

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

Is there any dif

相关标签:
3条回答
  • 2020-12-13 10:26

    Let's compare obj1 and obj2 in this code:

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

    Prototypical chain

    Object.create creates a new object with the specified [[Prototype]], and Object.assign assigns the properties directly on the specified object:

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

    The prototypical chains of obj1 and obj2 look like

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

    Properties

    Object.create defines properties and Object.assign only assigns them.

    When creating a property, assignments will create it as configurable, writable and enumerable. When defining a property, you can specify those flags, but by default it's not configurable, nor writable and not enumerable.

    Object.getOwnPropertyDescriptor(obj1, 'myProp');
      // { value: 1, writable: false, enumerable: false, configurable: false }
    Object.getOwnPropertyDescriptor(obj2, 'myProp');
      // { value: 1, writable: true, enumerable: true, configurable: true }
    
    0 讨论(0)
  • 2020-12-13 10:28

    Object.assign() provides shallow copying (Only properties and methods) and it will override the method and property declared.

    while Object.create() provides Deep copying provides prototype chain.

    0 讨论(0)
  • 2020-12-13 10:36

    you can also combine them Object.assign(Object.create(object)) for both shallow and deep copy, they are perfectly valid pattern in ES6.

    0 讨论(0)
提交回复
热议问题