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']
```