参考的文档:阮一峰ES6入门

1.属性名表达式

JavaScript定义对象的属性有两种方法

image.png

上面代码的方法一是直接用标识符作为属性名;
方法二是用表达式作为属性名,这是要将表达式放在方括号之内。

ES6允许字面量定义对象时,用方法二(表达式)作为对象的属性名,即把表达式放在括号内。

  1. let propKey = 'foo';
  2. let obj = {
  3. [propKey]: true,
  4. ['a' + 'bc']: 123
  5. };

2.super关键字

this关键字总是指向函数所在的当前对象,es6又新增了另一个类似的关键字super,指向当前对象的原型对象。

  1. const proto = {
  2. foo: 'hello'
  3. };
  4. const obj = {
  5. foo: 'world',
  6. find() {
  7. return super.foo;
  8. }
  9. };
  10. Object.setPrototypeOf(obj, proto);
  11. obj.find() // "hello"

注意:Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null

  1. //语法
  2. Object.setPrototypeOf(obj, prototype)

3.扩展运算符

对象的扩展运算符(…)用于取出对象的所有可遍历属性,拷贝到当前对象之中。
扩展数组

  1. let foo = { ...['a', 'b', 'c'] };
  2. foo
  3. // {0: "a", 1: "b", 2: "c"}

扩展特殊字符

  1. // 等同于 {...Object(true)}
  2. {...true} // {}
  3. // 等同于 {...Object(undefined)}
  4. {...undefined} // {}
  5. // 等同于 {...Object(null)}
  6. {...null} // {}

扩展字符串

  1. {...'hello'}
  2. // {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}

4.Object.freeze

用于冻结对象,让对象内部属性不会被改变。不可新增,不可修改

  1. const obj1 = { name: 'zx' }
  2. obj1.name = 'tzq'
  3. const obj2 = Object.freeze({ name: 'zx' })
  4. obj2.name = 'tzq'
  5. console.log(obj1.name, obj2.name) // 'tzq' 'zx'

5.对象解构(动态属性)

一般写法

  1. // 在 id 和 value 都是动态的,该怎么使用解构语法
  2. const pick = (target, idKey, valueKey) => {
  3. const id = target[idKey]
  4. const value = target[valueKey]
  5. return { id, value }
  6. }
  7. pick({ myId: 'foo', myValue: 'bar' }, "myId", "myValue")

解构写法

  1. // nice
  2. const pick = (target, idKey, valueKey) => {
  3. const { [idKey]: id, [valueKey]: value } = target
  4. return { id, value }
  5. }
  6. pick({ myId: 'foo', myValue: 'bar' }, "myId", "myValue")
  7. // { id: 'foo', value: 'bar' }