对象的扩展-《ES6 入门教程》阮一峰学习笔记

150 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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中操作对象更加便利,针对对象本身的方法也越来越全面。