类的数据类型就是函数,类本身就指向构造函数。
类不存在变量提升(hoist),这一点与 ES5 完全不同。
constructor 方法
必须使用new生成对象实例,与 ES5 一样,类的所有实例共享一个原型对象:
var p1 = new Point(2,3);
var p2 = new Point(3,2);
p1.__proto__ === p2.__proto__
//true
上面代码中,p1和p2都是Point的实例,它们的原型都是Point.prototype,所以proto属性是相等的。
使用实例的proto属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。
取值函数(getter)和存值函数(setter)
在“类”的内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
存值函数和取值函数是设置在属性的 Descriptor 对象上的。
属性表达式
类的属性名,可以采用表达式。
let methodName = 'getArea';
class Square {
constructor(length) {
// ...
}
[methodName]() {
// ...
}
}
上面代码中,Square类的方法名getArea,是从表达式得到的。
注意点
- 严格模式:类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。考虑到未来所有的代码,其实都是运行在模块之中,所以 ES6 实际上把整个语言升级到了严格模式。
- 不存在提升:类不存在变量提升(hoist),这一点与 ES5 完全不同。必须保证子类在父类之后定义。
- name 属性:由于本质上,ES6 的类只是 ES5 的构造函数的一层包装,所以函数的许多特性都被Class继承,包括name属性。name属性总是返回紧跟在class关键字后面的类名。
- Generator 方法:如果某个方法之前加上星号(*),就表示该方法是一个 Generator 函数。