1. 定义
函数声明和类声明之间的一个重要区别在于,函数声明会提升,类声明不会。
// 类声明 class Person {} // 类表达式 const Person = class {};
2. 类构造函数
// constructor 方法是一个特殊的方法,一个类只能有一个,如果没定义,默认添加一个空的constructor函数 // 使用new操作符实例化Person的操作等于使用new调用其构造函数。 class Person { constructor(name, age) { this.type = "人"; this.name = name; this.age = age; } say() { console.log("hello"); } } let yqcoder = new Person("yqcoder", 18); // Person {type: '人', name: 'yqcoder', age: 18}
3. getter 和 setter
// 在 class 内部可以使用 get 与 set 关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。 class Person { constructor(name, length) { this.name = name; this.length = length; } get nameL() { return this.name.length; } set nameL(value) { console.log("设置长度"); this.length = value; } } let yqcoder = new Person("yqcoder"); // Person {name: 'yqcoder', length: undefined} yqcoder.nameL; // 7 yqcoder.nameL = 9; // 设置长度 yqcoder; // Person {name: 'yqcoder', length: 9}
4. Generator 方法
// generator 函数 具有迭代功能 class Person { constructor(...args) { this.args = args; } *generatorFn() { for (let arg of this.args) { yield arg; } } } let yqcoder = new Person(1, 2, 3, 4); // Person {args: Array(4)} let generatorNext = yqcoder.generatorFn(); generatorNext.next(); // {value: 1, done: false} generatorNext.next(); // {value: 2, done: false} generatorNext.next(); // {value: 3, done: false} generatorNext.next(); // {value: 4, done: false} generatorNext.next(); // {value: undefined, done: false}
5. 静态属性、方法
// 静态的就是类实例不能调用,只有类本身可以用。 // 属性或方法前加static关键字,就变成静态的了。 // 使用静态属性或方法就是为了阻止被类实例继承 class Person { constructor(name) { this.name = name; } static type = "person"; static eat() { console.log("开饭了"); } } let yqcoder = new Person("yqcoder"); // Person {name: 'yqcoder'} yqcoder.type; // undefined yqcoder.eat(); // yqcoder.eat is not a function Person.type; // 'person' Person.eat(); // 开饭了 // 类继承类,可以使用继承类里的静态属性和方法 class P1 extends Person {} P1.type; // 'person' P1.eat(); // 开饭了
6. 类继承
// 语法:class 子类 extends 父类 // 子类中声明的方法名和父类中的方法名相同时,子类中的方法将覆盖继承于父类的方法,采用自己的 // 父类 class Person { constructor(name, age) { this.name = name; this.age = age; } } // 子类 super() 函数必须用 class Student extends Person { constructor(name, age, study) { super(name, age); this.study = study; } }