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



考虑以下代码:

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

obj1obj2 之间有什么区别,因为每个对象都是以不同的方式创建的?

让我们比较一下这段代码中的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 }

Object.assign()提供浅层复制(仅限属性和方法),它将覆盖声明的方法和属性。

Object.create()提供深度复制提供原型链。

我已经创建了一个完整的中等页面,确切地介绍了每种数据类型对浅拷贝和深拷贝的反应。

这是链接:https://siddharthsunchu1.medium.com/copies-of-javascript-shallow-and-deep-copy-ac7f8dcd1dd0

>您也可以将它们组合Object.assign(Object.create(object))用于浅拷贝和深拷贝,它们是 ES6 中完全有效的模式。

正如@emekaokoli提到的,你可以组合

喜欢这个:

const el = Object.assign(document.createElement("div"), {
    className: "hello",
    innerHTML:`
      <i>hello world</i>
    `,
    myProp:1
});
document.body.append(el);
console.log(el.myProp);

吉斯菲德尔

我们也可以像这样创建对象的深层副本

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

'

相关内容

  • 没有找到相关文章

最新更新