考虑以下代码:
var obj1 = Object.create({}, {myProp: {value: 1}}); var obj2 = Object.assign({}, {myProp: 1});
obj1 和 obj2 之间有什么区别,因为每个对象都是以不同的方式创建的吗?
obj1
obj2
Object.assign()提供浅复制(仅属性和方法),它将覆盖声明的方法和属性 . 而Object.create()提供Deep复制提供原型链 .
让我们在这段代码中比较 obj1 和 obj2 :
var target1 = {}, target2 = {}; var obj1 = Object.create(target1, {myProp: {value: 1}}); var obj2 = Object.assign(target2, {myProp: 1});
Prototypical chain
Object.create 使用指定的[[Prototype]]创建一个新对象, Object.assign 直接在指定对象上分配属性:
Object.create
Object.assign
obj1 !== target1; obj2 === target2;
obj1 和 obj2 的典型链看起来像
obj1 --> target1 --> Object.prototype --> null obj2 --------------> Object.prototype --> null
Properties
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 }
2 回答
Object.assign()提供浅复制(仅属性和方法),它将覆盖声明的方法和属性 . 而Object.create()提供Deep复制提供原型链 .
让我们在这段代码中比较
obj1
和obj2
:Prototypical chain
Object.create
使用指定的[[Prototype]]创建一个新对象,Object.assign
直接在指定对象上分配属性:obj1
和obj2
的典型链看起来像Properties
Object.create
定义属性,Object.assign
仅分配它们 .创建属性时,分配会将其创建为可配置,可写和可枚举 . 定义属性时,可以指定这些标志,但默认情况下,它不可配置,也不可写,也不可枚举 .