【问题标题】:What is difference between creating object using Object.create() and Object.assign()?使用 Object.create() 和 Object.assign() 创建对象有什么区别?
【发布时间】:2016-01-17 12:27:48
【问题描述】:

考虑以下代码:

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

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

【问题讨论】:

    标签: javascript object-create


    【解决方案1】:

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

    【讨论】:

    • 那么,我们可以说“create”是一种用于创建父类的实例,而“assign”只是用于处理属性吗?
    【解决方案2】:

    Object.assign() 提供浅拷贝(仅限属性和方法),它会覆盖声明的方法和属性。

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

    我创建了一个完整的媒体页面,详细介绍每种数据类型对浅拷贝和深拷贝的反应。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 听起来很奇怪,但作为new 运算符的替代方法,我喜欢这种技术,因为它会“键入”生成的 JS 对象。示例:
      • const Cat = Object.assign(Object.create(Animal.prototype), { takeANap: ()=>{ /*午睡代码*/ } }
      • 生成的Cat 变量将在调试器中显示为Cat 类型,您也可以使用instanceof
      【解决方案4】:

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

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

      `

      【讨论】:

        猜你喜欢
        • 2020-10-04
        • 1970-01-01
        • 2016-04-06
        • 2017-06-10
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2019-03-10
        • 2021-10-25
        相关资源
        最近更新 更多