Considering following code:
var obj1 = Object.create({}, {myProp: {value: 1}});
var obj2 = Object.assign({}, {myProp: 1});
Is there any dif
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 }
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.
you can also combine them Object.assign(Object.create(object)) for both shallow and deep copy, they are perfectly valid pattern in ES6.