学习ES6:对象扩展
es6 对象扩展
对象属性简洁表示
即只写属性名,属性值为属性名所代的变量。
属性和方法都可以。
某个方法若是generator,在简洁描述前加*
。
用于简写函数的返回值和模块输出变量。
1 | function getPoint() { |
1 | let o = {}; |
属性名表达式
把表达式放在中括号内,表达式的结果作为属性名。
属性名表达式与属性简介表示法不能同时使用,不过用作对象方法的时候,可以同时使用
方法的name属性
方法的name属性返回函数名
- 取值函数,返回
get 方法名
。 - 存值函数,返回
set 方法名
。 - bind方法创造的函数,返回
bound 方法名
。 - Function构造函数创造的函数,返回
anoymous 方法名
。 - 对象的方法是一个Symbol值,返回`Symbol值的描述。
Object.is()
方法用来比较两个值是否时严格相等的,与严格比较运算符(===)基本一致。
不同之处:
- +0不等于-0
- NaN等于NaN
1 | console.log(Object.is(+0, -0)); //false |
Object.assign()
- 用于将source对象所有的可枚举属性复制到target对象。
- 不可枚举的及继承的属性不会被复制。
- 相同属性名的属性,后面的属性值会覆盖前面的属性值。
- 该方法只能复制浅对象,对于嵌套的属性,该方法时直接替换目标对象中的相同属性名的属性。
- 该方法也可以用于数组,不过会将数组视为对象处理。
1 | let target = {a:1,b:2}; |
1 |
|
应用
- 为对象添加属性方法
- 克隆对象(仅克隆原始对象自身可枚举的属性,忽略继承属性)
- 合并多个对象
- 为属性设置默认值,并接受自定义赋值
属性的可枚举性及遍历
对象的每一个属性都有一个描述对象,用于控制该属性的行为。
其中有一个属性为enumerable,描述了该属性是否可枚举。
ES6规定,所有Class的原型的方法都是不可枚举的。
相关的遍历方法
方法 | 返回值或操作 |
---|---|
for…in… | 循环遍历对象自身的和继承的可枚举属性(不含Symbol) |
Object.keys(obj) | 返回一个数组,包括对象自身(不含继承)的可枚举属性(不含Symbol) |
Object.getOwnPropertyNames(obj) | 返回数组,包含对象自身的所有属性(不含Symbol,但包括不可枚举属性) |
Object.getOwnPropertySymbols(pbj) | 返回数组,包含对象自身的所有Symbol属性 |
reflect.ownKeys(obj) | 返回数组,包含对象自身的 所有 属性 |
reflect.enumerate(obj) | 返回Iterator对象,遍历对象自身的和继承的所有可枚举属性(不含Symbol) |
所有方法遍历的属性都遵守以下的次序规则:
- 首先遍历所有属性名为数字的属性,按数字升序排序。
- 其次遍历所有属性名为字符串的属性,按生成时间升序排序。
- 最后遍历所有属性名为Symbol值的属性,按生成时间升序排序。