类的属性名,可以采用表达式。给大家举一个例子,代码如下:
1 | let propName = "getMethod"; |
与函数一样,类也可以使用表达式的形式定义。
1 | // 使用表达式定义了一个类 |
此时我们可以看到Inner只在Class内部有定义,在外部使用会报错。此时,如果类的内部(Inner)没有用到的话,可以省略Inner,因此就可以写成下面这种形式:
1 | const Outer = class{}; |
采用Class表达式,可以写出立即执行的Class。代码如下:
1 | let person = new class{ |
在上面的代码中,person是一个立即执行的类的实例。
类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。考虑到未来所有的代码,其实都是运行在模块之中,所以 ES6 实际上把整个语言升级到了严格模式。
1 | new Person(); // ReferenceError: Person is not defined |
在上面代码中,Person类使用在前,定义在后,此时这样使用就会报错。其原因是因为ES6不会把类的声明提升到代码头部。
为什么要说“类不存在变量提升”?
其原因是因为和继承有关,必须保证子类在父类之后定义。
1 | { |
由于本质上,ES6 的类只是 ES5 的构造函数的一层包装,所以函数的许多特性都被Class继承,包括name属性。
1 | class Person{} |
注意:name属性总是返回紧跟在class关键字后面的类名。
如果某个方法之前加上星号(*),就表示该方法是一个 Generator 函数。在之前的笔记中我分享过Generator的相关笔记,附上我之前的笔记链接:http://blog.chanke.xyz/daipi173/1669/es6zhishengchengqigenerator/
1 | class Person{ |
在上面的代码中,Person类的Symbol.iterator方法前有一个星号,表示该方法是一个 Generator 函数。Symbol.iterator方法返回一个Person类的默认遍历器,for of循环会自动调用这个遍历器。