为了保证的可读性,本文采用意译而非直译。
在ES5中,咱们合并对象通常使用Lodash的 _.extend(target,[sources]) 方法,在ES6中咱们使用 Object.assign(target,[sources])来合并对象,当然现在最常用应该是使用 Rest/Spread(展开运算符与剩余操作符)。
来个例子:
在上面的示例中, …cat将 cat的属性复制到新的对象 dog中, .sound属性接收最终值 ‘woof’。
本文将介绍对象 spread 和 rest语法,包括对象传播如何实现对象克隆、合并、属性覆盖等方法。
下面简要介绍一下可枚举属性,以及如何区分自有属性和继承属性。这些是理解对象 spread 和 rest工作原理的必要基础。
1.属性描述对象
JS 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。
下面是属性描述对象的一个例子。
属性描述对象提供6个元属性。
(1)value
value是该属性的属性值,默认为undefined。
(2)writable
writable是一个布尔值,表示属性值(value)是否可改变(即是否可写),默认为true。
(3)enumerable
enumerable是一个布尔值,表示该属性是否可遍历,默认为 true。如果设为 false,会使得某些操作(比如 for…in循环、 Object.keys())跳过该属性。
(4)configurable
configurable是一个布尔值,表示可配置性,默认为 true。如果设为 false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象( value属性除外)。也就是说, configurable属性控制了属性描述对象的可写性。
(5)get
get是一个函数,表示该属性的取值函数( getter),默认为 undefined。
(6)set
set是一个函数,表示该属性的存值函数( setter),默认为 undefined。
2.可枚举和自有属性
JS中的对象是键和值之间的关联。 键类型通常是字符串或 symbol。 值可以是基本类型(string、boolean、number、undefined或null)、对象或函数。
下面使用对象字面量来创建对象:
2.1 可枚举的属性
enumerable 属性是一个布尔值,它表示在枚举对象的属性时该属性是否可访问。