使用 Object.create() 和 Object.assign() 创建对象有什么区别?
What is difference between creating object using Object.create() and Object.assign()?
考虑以下代码:
var obj1 = Object.create({}, {myProp: {value: 1}});
var obj2 = Object.assign({}, {myProp: 1});
obj1
和 obj2
之间是否有任何区别,因为每个对象都是以不同的方式创建的?
让我们比较一下这段代码中的 obj1
和 obj2
:
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;
obj1
和obj2
的原型链看起来像
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 }
Object.assign()
提供浅拷贝(仅属性和方法),它会覆盖方法和属性 声明。
而Object.create()
提供深度复制提供原型链。
我创建了一个完整的中型页面,详细介绍每种数据类型对浅拷贝和深拷贝的反应。
这是link:https://siddharthsunchu1.medium.com/copies-of-javascript-shallow-and-deep-copy-ac7f8dcd1dd0
你也可以组合它们 Object.assign(Object.create(object))
用于浅拷贝和深拷贝,它们在 ES6 中是完全有效的模式。
我们也可以像这样创建对象的深拷贝
var obj = {id:1, fname:'sajid', lname: 'imtiaz'};
var deepObj = Object.assign({},obj)
`
考虑以下代码:
var obj1 = Object.create({}, {myProp: {value: 1}});
var obj2 = Object.assign({}, {myProp: 1});
obj1
和 obj2
之间是否有任何区别,因为每个对象都是以不同的方式创建的?
让我们比较一下这段代码中的 obj1
和 obj2
:
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;
obj1
和obj2
的原型链看起来像
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 }
Object.assign()
提供浅拷贝(仅属性和方法),它会覆盖方法和属性 声明。
而Object.create()
提供深度复制提供原型链。
我创建了一个完整的中型页面,详细介绍每种数据类型对浅拷贝和深拷贝的反应。
这是link:https://siddharthsunchu1.medium.com/copies-of-javascript-shallow-and-deep-copy-ac7f8dcd1dd0
你也可以组合它们 Object.assign(Object.create(object))
用于浅拷贝和深拷贝,它们在 ES6 中是完全有效的模式。
我们也可以像这样创建对象的深拷贝
var obj = {id:1, fname:'sajid', lname: 'imtiaz'};
var deepObj = Object.assign({},obj)
`