返回

ES6--9.JS类解析之,如何利用JS轻松构建自己的类?

前端

引言

类是面向对象编程(OOP)的基础,它允许我们创建具有共同特征和行为的对象。在ES6之前,JavaScript没有原生的类支持,我们通常使用原型继承和构造函数来模拟类。然而,ES6引入了类的概念,使得JavaScript的OOP开发变得更加简单和高效。

1. 类声明

类声明语法允许我们使用constructor直接定义一个构造器,而不需要先定义一个函数,再把它当做构造器来使用。类中的方法使用的是函数简写语法,省略了function。类声明不会被提升,这与ES6之前通过函数定义不同。类声明与使用let定义一样,因此也存在暂时死区(temporal dead zone)。

示例:

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.`);
  }
}

const person = new Person('John Doe', 30);
person.greet(); // Hello, my name is John Doe and I am 30 years old.

2. 类继承

类继承允许我们创建一个子类,它继承了父类的属性和方法。子类可以覆盖父类的方法,也可以添加自己的方法。

示例:

class Employee extends Person {
  constructor(name, age, jobTitle) {
    super(name, age); // Call the parent constructor
    this.jobTitle = jobTitle;
  }

  work() {
    console.log(`I am ${this.name} and I work as a ${this.jobTitle}.`);
  }
}

const employee = new Employee('Jane Doe', 25, 'Software Engineer');
employee.greet(); // Hello, my name is Jane Doe and I am 25 years old.
employee.work(); // I am Jane Doe and I work as a Software Engineer.

3. 类方法

类方法是属于类的函数,可以被类的所有实例访问。类方法使用static关键字声明。

示例:

class Person {
  static createPerson(name, age) {
    return new Person(name, age);
  }
}

const person = Person.createPerson('John Doe', 30);
console.log(person); // Person { name: 'John Doe', age: 30 }

4. 类实例

类实例是类的具体对象。我们可以使用new关键字创建类实例。

示例:

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

const person = new Person('John Doe', 30);
console.log(person.name); // John Doe
console.log(person.age); // 30

5. 类属性

类属性是属于类的变量,可以被类的所有实例访问。类属性使用static关键字声明。

示例:

class Person {
  static species = 'Homo sapiens';
}

console.log(Person.species); // Homo sapiens

6. 私有属性和方法

私有属性和方法只允许在类的内部访问。私有属性和方法使用#前缀声明。

示例:

class Person {
  #name;
  #age;

  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.`);
  }
}

const person = new Person('John Doe', 30);
person.greet(); // Hello, my name is John Doe and I am 30 years old.
console.log(person.#name); // Error: Cannot access private field

7. 公有属性和方法

公有属性和方法允许在类的内部和外部访问。公有属性和方法使用public关键字声明。

示例:

class Person {
  public name;
  public age;

  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.`);
  }
}

const person = new Person('John Doe', 30);
person.greet(); // Hello, my name is John Doe and I am 30 years old.
console.log(person.name); // John Doe
console.log(person.age); // 30

8. 静态属性和方法

静态属性和方法只属于类本身,不能被类的实例访问。静态属性和方法使用static关键字声明。

示例:

class Person {
  static species = 'Homo sapiens';

  static createPerson(name, age) {
    return new Person(name, age);
  }
}

console.log(Person.species); // Homo sapiens
const person = Person.createPerson('John Doe', 30);
console.log(person); // Person { name: 'John Doe', age: 30 }

9. 实例成员和类成员

实例成员是属于类实例的属性和方法,只能被该实例访问。类成员是属于类的属性和方法,可以被类的所有实例访问。实例成员使用this关键字声明,类成员使用static关键字声明。

示例:

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.`);
  }

  static species = 'Homo sapiens';

  static createPerson(name, age) {
    return new Person(name, age);
  }
}

const person = new Person('John Doe', 30);
person.greet(); // Hello, my name is John Doe and I am 30 years old.
console.log(person.name); // John Doe
console.log(person.age); // 30
console.log(Person.species); // Homo sapiens
const person2 = Person.createPerson('Jane Doe', 25);
console.log(person2); // Person { name: 'Jane Doe', age: 25 }

10. 访问器

访问器允许