创建对象有多种方法,我们来一一对比看看区别,再分析他们的差异。
'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()创建一个空对象时它时没有原型的。