Object相关操作(二),new Object()和Object.create()的用法

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

'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()创建一个空对象时它时没有原型的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,793评论 1 32
  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 6,399评论 0 6
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,615评论 0 21
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,090评论 0 3
  • 仰望天空, 一半是蔚蓝, 一半夹杂着乌云。 落日的余晖, 映在高楼的壁上,金碧辉煌。 时光, 时光, 你慢些吧, ...
    澹月孤影阅读 1,241评论 0 0