返回

在 JavaScript 中巧妙玩转 ES6 类

前端

  1. 构造函数

在 ES6 中,类是通过 class 来定义的,它包含一个构造函数。构造函数用于初始化类的实例,并在创建实例时被自动调用。

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

上面的代码定义了一个 Person 类,它具有两个属性:nameage。当使用 new 关键字创建一个新的 Person 实例时,构造函数 Person(name, age) 会被自动调用,并将 nameage 的值分配给新实例的 nameage 属性。

2. 继承

ES6 中的类支持继承,这允许您创建一个新的类,它继承了另一个类的属性和方法。继承通过 extends 关键字来实现。

class Student extends Person {
  constructor(name, age, school) {
    super(name, age);
    this.school = school;
  }
}

上面的代码定义了一个 Student 类,它继承了 Person 类。这意味着 Student 类具有 Person 类的所有属性和方法,还添加了一个新的属性 school

3. 实例方法

实例方法是类中定义的方法,它可以被类的实例调用。实例方法使用 prototype 属性来定义。

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

上面的代码定义了一个 Person 类,它具有一个实例方法 greet()。当我们创建一个新的 Person 实例时,我们可以使用 greet() 方法来向控制台打印出该实例的姓名和年龄。

4. 静态方法

静态方法是类中定义的方法,它可以被类本身调用,而不是类的实例。静态方法使用 static 关键字来定义。

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  static greetAll(people) {
    for (const person of people) {
      console.log(`Hello, my name is ${person.name} and I am ${person.age} years old.`);
    }
  }
}

上面的代码定义了一个 Person 类,它具有一个静态方法 greetAll()。我们可以使用 Person.greetAll() 方法来向控制台打印出所有 Person 实例的姓名和年龄。

5. 访问器

访问器是类中定义的特殊方法,它允许我们获取和设置类的属性。访问器使用 getset 关键字来定义。

class Person {
  constructor(name, age) {
    this._name = name;
    this._age = age;
  }

  get name() {
    return this._name;
  }

  set name(value) {
    if (value.length < 3) {
      throw new Error("Name must be at least 3 characters long.");
    }

    this._name = value;
  }
}

上面的代码定义了一个 Person 类,它具有两个访问器:nameagename 访问器用于获取和设置 _name 私有属性,age 访问器用于获取和设置 _age 私有属性。

6. 私有属性

私有属性是类中的属性,它只能在类的内部被访问。私有属性使用 # 符号来定义。

class Person {
  constructor(name, age) {
    this.#name = name;
    this.#age = age;
  }

  get name() {
    return this.#name;
  }

  set name(value) {
    if (value.length < 3) {
      throw new Error("Name must be at least 3 characters long.");
    }

    this.#name = value;
  }
}

上面的代码定义了一个 Person 类,它具有两个私有属性:#name#age。私有属性只能在类的内部被访问,不能被类的外部访问。

7. Symbol

Symbol 是 ES6 中引入的一种新的数据类型,它可以用来创建唯一的标识符。Symbol 不会被转换成字符串,也不会被枚举。

const nameSymbol = Symbol("name");
const ageSymbol = Symbol("age");

class Person {
  constructor(name, age) {
    this[nameSymbol] = name;
    this[ageSymbol] = age;
  }

  get name() {
    return this[nameSymbol];
  }

  set name(value) {
    if (value.length < 3) {
      throw new Error("Name must be at least 3 characters long.");
    }

    this[nameSymbol] = value;
  }
}

上面的代码定义了一个 Person 类,它使用 Symbol 来创建唯一的标识符 nameSymbolageSymbol。Symbol 确保了 nameage 属性是唯一的,不会与其他属性冲突。

8. 类表达式

类表达式与函数表达式非常相似,它们都允许您在代码块中定义一个类。

const Person = class {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
};

上面的代码定义了一个 Person 类,它使用类表达式来定义。类表达式可以像函数表达式一样被分配给一个变量,也可以像函数表达式一样被立即调用。

9. 类声明

类声明是 ES6 中引入的一种新的语法,它允许您在代码块之外定义一个类。

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

上面的代码定义了一个 Person 类,它使用类声明来定义。类声明可以像函数声明一样被声明,也可以像函数声明一样被立即调用。

总结

在本文中,我们探索了 JavaScript 中 ES6 类的各种特性,包括构造函数、继承、实例方法、静态方法、访问器、私有属性、Symbol、类表达式和类声明。深入理解这些特性将帮助您写出更清晰、更可维护的代码。