美文网首页
Object相关操作(二),new Object()和Objec

Object相关操作(二),new Object()和Objec

作者: 石豌豆 | 来源:发表于2019-11-16 15:48 被阅读0次

    创建对象有多种方法,我们来一一对比看看区别,再分析他们的差异。

    'use strict'
    let a = {name: 'lily'}
    let b = new Object(a)
    let c = Object.create(a)
    console.log(b) // {a: 1}
    console.log(c) // {}
    

    同样是创建一个对象,为什么得到的值不一样呢?
    new Object() 通过构造函数来创建对象, 添加的属性是在自身实例下。
    Object.create() es6创建对象的另一种方式,可以理解为继承一个对象, 添加的属性是在原型下。

    1、使用new Object()创建
    'use strict'
    let a = {name: 'lily'}
    let b = new Object(a)
    console.log(b) // {name: 'lily'}
    console.log(b.__proto__) // {}
    console.log(b.name) // lily
    
    2、使用Object.create()创建
    'use strict'
    let a = {name: 'lily'}
    let c = Object.create(a)
    console.log(c) // {}
    console.log(c.__proto__) // {name: 'lily'}
    console.log(c.name) // lily
    c.name = 'lucy'
    console.log(c) // {name: 'lucy'}
    console.log(c.__proto__) // {name: 'lily'}
    console.log(c.name) // lucy
    

    通过Object.create()创建的对象属性是挂在原型上,而不是实例上,虽然还是可以通过c.name获取到lily,但不是他本身的属性。
    我们具体看看这两个方法的用法及参数

    • new Object()
      这里使用了new 我们就知道这是实例化的标志,后面可以带一个参数,为对象
    'use strict'
    let a = {name: 'lily'}
    let b = new Object(a)
    console.log(b) // {name: 'lily'}
    console.log(b.toString) // ƒ toString() { [native code] }
    这里得到的是一个新的对象,但完美的继承了Object的原型链。
    
    • Object.create(obj, propertiesObject)
      接收两个参数
      obj: 一个对象,新创建的对象的原型
      propertiesObject: 非必传,一个对象,添加的属性及描述
    'use strict'
    let a = {name: 'lily'}
    let c = Object.create({}, {name: {value: 30}})
    console.log(c) // {name: 30}
    console.log(Object.getOwnPropertyDescriptor(c, 'name')) // {value: 30, writable: false, enumerable: false, configurable: false}
    console.log(c.__proto__) // {}
    console.log(c.toString) // ƒ toString() { [native code] }
    

    这里创建的对象C的属性name的默认描述为不可配置、不可枚举、不可写入,参考上一篇对象的Object.defineProperty
    还有一点我们需要注意,这里创建C时对应的原型为{},也可以通过原型链找到toString方法,那如果换一种方式我们看看

    'use strict'
    let a = {name: 'lily'}
    let c = Object.create(null, {name: {value: 30}})
    console.log(c) // {name: 30}
    console.log(Object.getOwnPropertyDescriptor(c, 'name')) // {value: 30, writable: false, enumerable: false, configurable: false}
    console.log(c.__proto__) // undefined
    console.log(c.toString) // undefined
    

    这里可以看到c的原型换成了null,没有继承Object的原型链上面的方法, 所以如果我们使用new Object()创建一个空对象时,它会继承Object的原型链,但如果我们使用Object.create()创建一个空对象时它时没有原型的。

    相关文章

      网友评论

          本文标题:Object相关操作(二),new Object()和Objec

          本文链接:https://www.haomeiwen.com/subject/tieyictx.html