对象
es6新增声明对象的方法
es6新增了一种方式Object.create()
创建一个对象,可以通过指定第一个参数指定对象的原型
例子:
// 第一个参数指定新创建对象的原型对象,必须是一个 对象 或者 null
// null值创建的对象原型将未定义,也就不存在对象的一些公用方法,比如toString()等方法
// 第二个参数表示对象拥有的属性描述,可以省略,省略的话值为 undefined
let obj = Object.create(null, {
// foo会成为所创建对象的数据属性
foo: {
// 这个对象是对foo属性的描述
writable:true,
configurable:true,
value: "hello"
},
})
TIP
es6推荐使用Object.getPrototypeOf(object)
来获取对象的原型
属性描述符
属性描述符可以使用六个值来描述
- configurable: 为 true 时,属性描述符才可以被改变,即是否允许修改这六个属性描述符的值
- writable: 为 true 时,属性值才可以背被赋值运算符
=
改变 - enumberable: 为 true 时,对象的属性值才能被枚举(即遍历时是否会被遍历到)
- value:属性的初始值(即定义的时候的值,描述符未给value值将会是undefined
- get: 值为一个函数,定义了此函数,将会在获取属性值时执行此函数,函数返回值当做属性值
- set: 值为一个函数,定义了此函数(需要定义一个参数,接受设置属性时候的属性值),将会在设置属性值时执行次函数,此函数负责修改设置的属性值
TIP
获取一个对象的属性描述符时:
可以使用Object.getOwnPropertyDescriptor(object, propertyName)
动态键名
es6可以使用变量来动态生成一个对象的键名
例子:
let name = 'Myname'
let obj = {
[name]: 'Myname'
}
console.log(obj) // { Myname: 'Myname' }
使用symbol当做键名
Symbol是一个唯一的字符串,所以是不会存在属性明冲突的
let prop = Symbol()
let prop1 = Symbol()
let obj = {
[prop]: 'symbolKey',
[prop1]: 'symbolKey1'
}
console.log(obj) // { [Symbol()]: 'symbolKey', [Symbol()]: 'symbolKey1' }
TIP
symbol的属性键名可以通过Object.getOwnPropertySymbols(object)
来获取,使用Object.keys(object)
和Object.getOwnPropertyNames(object)
是无法获取到的
对象的浅拷贝
es6之前浅拷贝一个对象,需要使用一个for循环来实现,es6提供了Object.assign()
let obj1 = {
a: 1,
b: 2
}
// 可以使用另外的一种语法
// let obj2 = {...obj1}
// assign的第一个参数为目标对象,之后的参数是需要拷贝的对象,可以有多个拷贝对象
// 多对象重名属性后面将会覆盖前面的
// 多对象拷贝语法
// let obj2 = {...obj1, ...obj3}
let obj2 = Object.assign({}, obj1)
console.log(obj2)
obj2.a = 100
console.log(obj1) // { a: 1, b: 2 }