1. 类定义

定义类也有两种方式,类声明和类表达式,两种方式都使用class关键字加大括号

  1. //类声明
  2. class Person{}
  3. //类表达式
  4. let Person = class{}

与函数表达式类似,类表达式在它们被求值前也不能引用,不同的事,类定义不可以提升.另一个跟函数声明不同的地方是,函数受函数作用域限制,而类受块作用域限制.

2. 类的构成

构造函数 实例方法 获取函数 设置函数 和静态类方法

2.1 类构造函数

constructor关键字用于在类定义块内部创建类的构造函数.使用new操作符实例化类的操作等于使用new调用其构造函数(在这个函数内部,可以为新创建的实例(this),添加”自有”属性)

2.2 原型方法

为了在实例间共享方法,类定义语法把在类块中定义的方法作为原型方法.

2.3 访问器

类定义支持获取和设置访问器

  1. class Person {
  2. get name() {
  3. return this._name
  4. }
  5. set name(value) {
  6. this._name = value
  7. }
  8. }
  9. let p = new Person()
  10. p.name = 'Jake'
  11. console.log(p.name)

2.4 静态类方法

可以在类上定义静态方法,这些方法通常用于执行不特定于实例的操作,也不要求存在类的实例.静态类成员在类定义中使用static关键字作为前缀.静态成员每个类上只能有一个.静态成员中this引用类自身.
静态类方法非常适合作为实例工厂:

  1. class Person {
  2. constructor(age) {
  3. this._age = age
  4. }
  5. sayAg() {
  6. console.log(this._age)
  7. }
  8. static create() {
  9. return new Person(Math.floor(Math.random()*100))
  10. }
  11. }

2.5 迭代器与生成器

类定义语法支持在原型和类本身上定义生成器方法,因此可以通过添加一个默认的迭代器,把类实例变成可迭代对象.

  1. class Person() {
  2. constructor() {
  3. this.nickname = ['Jack','John','slash']
  4. }
  5. *[Symbol.iterator]() {
  6. yield *this.nickname.entries()
  7. }
  8. }
  9. let p = new Person()
  10. for(let [key,nickname] in p){
  11. console.log(nickname)
  12. }

3. 继承