类的数据类型就是函数,类本身就指向构造函数。

类不存在变量提升(hoist),这一点与 ES5 完全不同。

constructor 方法

必须使用new生成对象实例,与 ES5 一样,类的所有实例共享一个原型对象:

  1. var p1 = new Point(2,3);
  2. var p2 = new Point(3,2);
  3. p1.__proto__ === p2.__proto__
  4. //true

上面代码中,p1和p2都是Point的实例,它们的原型都是Point.prototype,所以proto属性是相等的。

使用实例的proto属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。

取值函数(getter)和存值函数(setter)

在“类”的内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。

存值函数和取值函数是设置在属性的 Descriptor 对象上的。

属性表达式

类的属性名,可以采用表达式。

  1. let methodName = 'getArea';
  2. class Square {
  3. constructor(length) {
  4. // ...
  5. }
  6. [methodName]() {
  7. // ...
  8. }
  9. }

上面代码中,Square类的方法名getArea,是从表达式得到的。

注意点

  1. 严格模式:类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。考虑到未来所有的代码,其实都是运行在模块之中,所以 ES6 实际上把整个语言升级到了严格模式。
  2. 不存在提升:类不存在变量提升(hoist),这一点与 ES5 完全不同。必须保证子类在父类之后定义。
  3. name 属性:由于本质上,ES6 的类只是 ES5 的构造函数的一层包装,所以函数的许多特性都被Class继承,包括name属性。name属性总是返回紧跟在class关键字后面的类名。
  4. Generator 方法:如果某个方法之前加上星号(*),就表示该方法是一个 Generator 函数。