es6

http://es6.ruanyifeng.com/#docs/class

1.let

let
命令所在的代码块内有效

{ let a = 10; var b = 1;}
a // ReferenceError: 
a is not defined.b // 1

for循环的计数器,就很合适使用let命令。
不存在变量提升

var tmp = 123;
if (true) { 
  tmp = 'abc';
   // ReferenceError 
  let tmp;
}

暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

2.const

const的作用域与let命令相同:只在声明所在的块级作用域内有效。

var a = 1;// 如果在Node的REPL环境,可以写成
global.a// 或者采用通用方法,写成
this.awindow.a // 1
let b = 1;
window.b // undefined

3.类

class Logger {
   constructor() { 
        //this.printName = this.printName.bind(this); 
   }
  //可以有默认值
  printName(name = 'there') {
    this.print(`Hello ${name}`);
  }

  print(text) {
    console.log(text);
  }
}

const logger = new Logger();
const { printName } = logger;//取出属性
printName(); // TypeError: Cannot read property 'print' of undefined

2.Class的Generator方法

如果某个方法之前加上星号(*),就表示该方法是一个Generator函数。

class Foo {
  constructor(...args) {
    this.args = args;
  }
  * [Symbol.iterator]() {
    for (let arg of this.args) {
      yield arg;
    }
  }
}

for (let x of new Foo('hello', 'world')) {
  console.log(x);
}
// hello
// world

4.Class的静态方法

class Foo {
  static classMethod() {
    return 'hello';
  }
}

class Bar extends Foo {
  static classMethod() {
    return super.classMethod() + ', too';
  }
}

Bar.classMethod();

5.Class的静态属性和实例属性

因为ES6明确规定,Class内部只有静态方法,没有静态属性。
静态属性指的是Class本身的属性,即Class.propname
,而不是定义在实例对象(this)上的属性。

class Foo {}
Foo.prop = 1;
Foo.prop // 1

Class属性

class ReactCounter extends React.Component {
  state = {
    count: 0
  };
}

为了可读性可以直接列出来

class ReactCounter extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
  state;
//static myStaticProp = 42;静态的
}

5.多个接口实现

function mix(...mixins) {
  class Mix {}

  for (let mixin of mixins) {
    copyProperties(Mix, mixin);
    copyProperties(Mix.prototype, mixin.prototype);
  }

  return Mix;
}

function copyProperties(target, source) {
  for (let key of Reflect.ownKeys(source)) {
    if ( key !== "constructor"
      && key !== "prototype"
      && key !== "name"
    ) {
      let desc = Object.getOwnPropertyDescriptor(source, key);
      Object.defineProperty(target, key, desc);
    }
  }
}
```
上面代码的mix函数,可以将多个对象合成为一个类。使用的时候,只要继承这个类即可。
```
class DistributedEdit extends mix(Loggable, Serializable) {  // ...}
```
***
####1.对象转数组
```
let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']

// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
```

你可能感兴趣的:(es6)