1. 类定义
定义类也有两种方式,类声明和类表达式,两种方式都使用class关键字加大括号
//类声明
class Person{}
//类表达式
let Person = class{}
与函数表达式类似,类表达式在它们被求值前也不能引用,不同的事,类定义不可以提升.另一个跟函数声明不同的地方是,函数受函数作用域限制,而类受块作用域限制.
2. 类的构成
2.1 类构造函数
constructor关键字用于在类定义块内部创建类的构造函数.使用new操作符实例化类的操作等于使用new调用其构造函数(在这个函数内部,可以为新创建的实例(this),添加”自有”属性)
2.2 原型方法
为了在实例间共享方法,类定义语法把在类块中定义的方法作为原型方法.
2.3 访问器
类定义支持获取和设置访问器
class Person {
get name() {
return this._name
}
set name(value) {
this._name = value
}
}
let p = new Person()
p.name = 'Jake'
console.log(p.name)
2.4 静态类方法
可以在类上定义静态方法,这些方法通常用于执行不特定于实例的操作,也不要求存在类的实例.静态类成员在类定义中使用static关键字作为前缀.静态成员每个类上只能有一个.静态成员中this引用类自身.
静态类方法非常适合作为实例工厂:
class Person {
constructor(age) {
this._age = age
}
sayAg() {
console.log(this._age)
}
static create() {
return new Person(Math.floor(Math.random()*100))
}
}
2.5 迭代器与生成器
类定义语法支持在原型和类本身上定义生成器方法,因此可以通过添加一个默认的迭代器,把类实例变成可迭代对象.
class Person() {
constructor() {
this.nickname = ['Jack','John','slash']
}
*[Symbol.iterator]() {
yield *this.nickname.entries()
}
}
let p = new Person()
for(let [key,nickname] in p){
console.log(nickname)
}