04 对象的扩展

79 阅读2分钟
├── 对象的扩展
│   ├── 属性的简洁表示法
│   │     └─ 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。
│   ├── 属性名表达式
│   │     └─ 方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内。
│   ├── 方法的 name 属性
│   │     └─ 函数的`name`属性,返回函数名。对象方法也是函数,因此也有`name`属性。
│   │     └─ 如果对象的方法使用了取值函数(`getter`)和存值函数(`setter`),则`name`属性不是在该方法上面,而是该方法的属性的描述对象的`get``set`属性上面,返回值是方法名前加上`get``set`。
│   ├── 属性的可枚举性和遍历
│   │     └─ 可枚举性
│   │         └─ 对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。`Object.getOwnPropertyDescriptor`方法可以获取该属性的描述对象。
│   │         └─ `toString``length`属性的`enumerable`都是`false`,因此`for...in`不会遍历到这两个继承自原型的属性。
│   │     └─ 属性的遍历
│   │         └─     `for...in`循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
│   │         └─     `Object.keys`返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
│   │         └─     `Object.getOwnPropertyNames`返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
│   │         └─     `Object.getOwnPropertySymbols`返回一个数组,包含对象自身的所有 Symbol 属性的键名。
│   │         └─     `Reflect.ownKeys`返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
│   ├── super 关键字
│   │     └─     我们知道,`this`关键字总是指向函数所在的当前对象,ES6 又新增了另一个类似的关键字`super`,指向当前对象的原型对象。
│   ├── 对象的扩展运算符
│   │     └─ 解构赋值
│   │         └─ 对象的解构赋值用于从一个对象取值,相当于将目标对象自身的所有可遍历的(enumerable)、但尚未被读取的属性,分配到指定的对象上面。所有的键和它们的值,都会拷贝到新对象上面。
│   │         └─ 解构赋值 对象`o3`复制了`o2`,但是只复制了`o2`自身的属性,没有复制它的原型对象`o1`的属性。
│   │     └─ 扩展运算符
│   │         └─ 对象的扩展运算符(`...`)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。
│   │         └─ 扩展运算符的参数对象之中,如果有取值函数`get`,这个函数是会执行的。
│   ├── AggregateError 错误对象
│   │     └─