归纳整理ES6中的class类知识点

1. ES6中class类的介绍

在ES6中,引入了class类的概念来实现面向对象编程。在ES5之前,我们通过构造函数来创建对象,而ES6中的class类本质上也是一个构造函数的语法糖,它更加简洁易读。

我们可以使用class关键字定义一个类,并使用constructor方法定义属性和方法:

class Person {

constructor(name, age) {

this.name = name;

this.age = age;

}

sayHi() {

console.log('Hi, my name is ' + this.name);

}

}

let person = new Person('Tom', 18);

person.sayHi(); // Hi, my name is Tom

1.1 class类的继承

类还支持继承,我们可以使用extends关键字创建一个子类,并使用super关键字调用父类的构造函数和方法:

class Student extends Person {

constructor(name, age, grade) {

super(name, age);

this.grade = grade;

}

study() {

console.log('I am studying in grade ' + this.grade);

}

}

let student = new Student('Mike', 16, 9);

student.sayHi(); // Hi, my name is Mike

student.study(); // I am studying in grade 9

1.2 class类的静态方法

类还支持定义静态方法,它们可以直接通过类名来调用:

class Cat {

static sayHello() {

console.log('Hello, I am a cat');

}

}

Cat.sayHello(); // Hello, I am a cat

静态方法和实例方法的区别在于,静态方法没有this关键字,不能访问类的实例属性和方法。

2. class类的基本语法

2.1 类的定义

类的定义使用class关键字,它们的首字母通常大写,可以像函数一样带有参数:

class MyClass {

constructor(prop) {

this.prop = prop;

}

method() {}

}

上面的代码中,MyClass是一个类名,它有一个constructor方法,用于定义类的属性。在constructor方法中,this指代实例对象。

2.2 类的实例化

我们可以使用new关键字来实例化一个类,实例化后我们可以访问该类的属性和方法:

let instance = new MyClass('example');

console.log(instance.prop); // example

instance.method();

上面代码中,instance是MyClass类的实例,prop是它的一个属性,method是它的一个方法。

2.3 类的继承

类可以通过extends关键字从另一个类继承属性和方法:

class MySubClass extends MyClass {

constructor(prop) {

super(prop);

}

subMethod() {}

}

let instance = new MySubClass('example');

console.log(instance.prop); // example

instance.method();

instance.subMethod();

上面的代码中,MySubClass继承了MyClass,并且添加了一个subMethod方法。

2.4 类的静态方法

我们可以在类中定义静态方法,使用static关键字即可:

class MyClass {

static staticMethod() {}

}

MyClass.staticMethod();

上面的代码中,staticMethod是MyClass类的一个静态方法,可以直接通过类名调用,而不需要实例化。

2.5 类的实例属性

在类的实例上定义的属性,可以直接在constructor方法中定义,也可以在类体外面定义:

class MyClass {

constructor() {

this.instanceProp = '';

}

instanceMethod() {}

}

MyClass.prototype.instanceProp = '';

MyClass.prototype.instanceMethod = function() {};

上面的代码中,instanceProp和instanceMethod是在实例上定义的属性和方法。

2.6 类的静态属性

在类上定义的属性,可以使用static关键字定义静态属性:

class MyClass {

static staticProp = '';

static staticMethod() {}

}

MyClass.staticProp = '';

上面的代码中,staticProp和staticMethod是在类上定义的属性和方法,静态属性可以直接使用类名进行访问。

3. class类与模块的区别

class类和模块是ES6提供的两种不同的语法结构,它们有不同的作用和用法。

3.1 class类与实例

class类是用来构造实例的模板,它的本质是一个构造函数。它可以定义实例属性、静态属性、实例方法和静态方法,用来封装对象的行为。而实例是由class类创建的一个具体对象,具有一些特定的属性和方法。

例如,我们可以定义一个Person类,并创建多个person对象:

class Person {

constructor(name) {

this.name = name;

}

sayHi() {

console.log('Hi, my name is ' + this.name);

}

}

let person1 = new Person('Tom');

let person2 = new Person('Mike');

person1.sayHi(); // Hi, my name is Tom

person2.sayHi(); // Hi, my name is Mike

3.2 模块与命名空间

模块是用来封装一组相关的代码,用来构建复杂的程序。它的本质是一个独立的文件作用域,可以导出和导入变量、函数、类和其他模块。模块用来解决命名冲突和依赖管理的问题,可以方便地将程序分为多个功能模块,增加代码的复用和可维护性。

例如,我们可以将Person类定义为一个模块,并导出它的方法和属性:

export default class Person {

constructor(name) {

this.name = name;

}

sayHi() {

console.log('Hi, my name is ' + this.name);

}

}

import Person from './person.js';

let person = new Person('Tom');

person.sayHi(); // Hi, my name is Tom

上面的代码中,我们可以通过导入import语句来使用Person类,而不需要全局的命名空间。这可以更好地管理程序的依赖性,改善代码的可读性。

4. class类实现细节

4.1 class类的继承

在子类的constructor方法中必须调用super()方法,这是因为子类没有自己的this对象,必须先通过父类的构造函数来创建它。

class Parent {

constructor(name) {

this.name = name;

}

}

class Child extends Parent {

constructor(name, age) {

super(name);

this.age = age;

}

}

上面的代码中,子类Child继承了父类Parent,并且在它的构造函数中调用了super()方法,以便创建它的父类属性this.name。

4.2 class类的getter和setter方法

在class类中也可以定义getter和setter方法,用于访问和修改类的私有属性:

class Rectangle {

constructor(width, height) {

this._width = width;

this._height = height;

}

get area() {

return this._width * this._height;

}

set width(width) {

this._width = width;

}

set height(height) {

this._height = height;

}

}

let rect = new Rectangle(10, 20);

console.log(rect.area); // 200

rect.width = 5;

rect.height = 10;

console.log(rect.area); // 50

上面的代码中,我们可以使用getter和setter方法来访问和修改私有属性this._width和this._height,而不会直接访问它们。

4.3 class类的绑定this

在class类中定义的方法,只有在调用时才会绑定this,否则this将会指向undefined或全局对象。

为了解决这个问题,我们可以使用bind()方法绑定调用方法的this对象:

class Person {

constructor(name) {

this.name = name;

this.sayHi = this.sayHi.bind(this);

}

sayHi() {

console.log('Hi, my name is ' + this.name);

}

}

let person = new Person('Tom');

person.sayHi(); // Hi, my name is Tom

上面的代码中,我们使用bind()方法将sayHi()方法的this绑定到person对象。这样在调用时,sayHi()方法的this将会指向person对象。

4.4 class类的继承方法

在class类中,子类可以继承父类的实例方法和静态方法,它们可以通过super关键字和子类对象来访问。例如:

class Parent {

instanceMethod() {}

static staticMethod() {}

}

class Child extends Parent {

childMethod() {

super.instanceMethod();

Parent.staticMethod();

}

}

上面的代码中,Child继承了Parent的实例方法instanceMethod()和静态方法staticMethod(),并在它的childMethod()中使用super和Parent类来调用这些方法。

5. ES6中的继承与传统的继承方式的比较

ES6中的class类和传统的基于原型链的继承方式相比,具有以下几个优点:

5.1 代码更加简洁易读

使用class类的语法,可以更加清晰地定义类的属性、方法和继承关系,代码更加容易理解和维护,也更容易调试和测试。

5.2 支持模块化加载

ES6中的class类可以通过模块化加载机制来使用,可以更好地管理依赖关系和代码组织。

5.3 父类的constructor方法自动执行

在基于原型链的继承方式中,需要手动调用父类构造函数来创建子类对象,而ES6中的class类继承不需要这样做。子类可以通过super关键字调用父类的constructor方法,自动创建父类的实例属性和方法。

5.4 支持静态方法

ES6中的class类支持定义静态方法,可以方便地管理和调用类的共享方法。

5.5 支持继承内置对象

ES6中的class类还支持继承内置的对象,如Array、Date、RegExp等。