持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
前言
在ES6之前,创建对象的方法就有很多了,例如:工厂模式(定义属性输出object实例对象)、构造函数模式(定义属性输出对象例如person实例对象)、原型模式(将所有属性与方法定义在公有区域原型对象上)、组合模型(属性定义在实例对象上、函数定义在原型对象上)。
ES6在这些的基础之上,让定义与操作对象的方式变得更加简洁易懂。下面让我们来看看ES6对于对象有哪些扩展吧!
ES6对于对象的扩展
属性的简洁表示法
在ES6中允许在大括号中直接写入变量和函数,作为对象的属性和方法。
const name="Alan"
const age=13
const obj={
name:name,
age:age,
fun:function fun(params) {}
}
如对象属性名和变量名相同,可以使用简写形式
const obj={
name,age,
fun(params) {}
}
简洁写法在函数返回值为对象、模块化导出对象和打印对象时非常方便,可以省略部分代码。
属性名表达式
在ES6之前,可以通过obj['a'+'bc']='abc'来定义对象的属性,但ES6在用字面量时也可以使用这种方式来定义对象属性与方法。
const obj={
['name']:"Alan",
['a'+'ge']:20,
['fun'](){}
}
属性的可枚举性和遍历
对象的每个属性都有一个描述对象,用于控制该属性的行为。Object.getOwnPropertyDescriptor(object,property)方法可以获取该属性的描述对象。
const obj={
name:"alan",
fun(params) {
}
}
console.log(Object.getOwnPropertyDescriptor(obj,"name"))
//{ value: 'alan', writable: true, enumerable: true, configurable: true }
console.log(Object.getOwnPropertyDescriptor(obj,'fun'))
/*
{
value: [Function: fun],
writable: true,
enumerable: true,
configurable: true
}*/
若想得到所有属性(最外层)的描述对象,可以通过Object.getOwnPropertyDescriptors(object)方法获得一个对象包含所有属性的描述对象。
描述对象中的属性value代表属性的值,writable代表是否可读写。enumerable代表是否可枚举,若为false,for...in循环、Object.keys()、JSON.stringify()、Object.assign()将会忽略此属性。
在书中还提到了我们大多数时候只关心对象自身的属性。所以,尽量不要用for...in循环,而用Object.keys()代替。
属性的遍历
在ES6新增了Object.keys(obj)方法来遍历对象自身的(不含继承)可枚举的键名(不含symbol类型属性)。
但有一个方法Object.getOwnPropertyNames(obj)可以遍历到不可枚举的属性。
对于symbol类型的属性,有一个专门的方法Object.getOwnPropertySymbols(obj)来遍历所有symbol属性的键名
最后,通过映射对象方法Reflect.ownKeys(obj)可返回包含所有属性(不含继承,含symbol类型)
以上所有返回值都是数组类型
并且返回时
- 首先遍历所有数值键,按照数值升序排列。
- 其次遍历所有字符串键,按照加入时间升序排列。
- 最后遍历所有 Symbol 键,按照加入时间升序排列。
总结
总之,在ES6中操作对象更加便利,针对对象本身的方法也越来越全面。