返回

初识ES6:简明扼要的Class语法探索之旅

前端

ES6 中的 class 是一个语法糖结构,底层依然是基于原型和构造函数。何以见得呢?让我们通过几个简单的例子来探索 class 的本质和使用方式。

首先,我们来看一个简单的 ES6 class 定义:

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

这个 class 定义了一个名为 Person 的类,它有两个属性:name 和 age。同时,它还定义了一个名为 greet 的方法,用于向控制台输出一个问候语。

要使用这个类,我们可以通过 new 来创建一个实例:

const person = new Person('John', 30);

person.greet(); // Hello, my name is John and I am 30 years old.

这个代码创建了一个名为 person 的 Person 实例,并调用了它的 greet 方法。

class 语法糖的底层实现是使用原型和构造函数。每个 class 都有一个 prototype 属性,它是一个对象,包含了类的所有方法。当我们创建一个 class 的实例时,JavaScript 会在内存中创建一个新的对象,并将其 prototype 属性设置为类的 prototype 属性。这意味着实例可以访问类中的所有方法。

我们可以通过 Object.getPrototypeOf() 方法来查看实例的 prototype 属性:

console.log(Object.getPrototypeOf(person)); // Person {}

输出结果表明,person 实例的 prototype 属性是 Person 类。

同样,每个 class 都有一个 constructor 方法,它是一个特殊的函数,用于初始化类的实例。当我们创建一个 class 的实例时,JavaScript 会自动调用 constructor 方法。

我们可以通过以下代码来查看 Person 类的 constructor 方法:

console.log(Person.constructor); // function Person(name, age) { ... }

输出结果表明,Person 类的 constructor 方法是一个名为 Person 的函数,它接收两个参数:name 和 age。

通过这两个例子,我们可以看到 ES6 class 的底层实现是使用原型和构造函数。class 语法糖只是让 JavaScript 的面向对象编程变得更加简洁和易读。

ES6 Class 的继承与方法覆盖

ES6 class 支持继承,我们可以通过 extends 关键字来实现继承。例如,我们可以创建一个名为 Student 的类,它继承自 Person 类:

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

  study() {
    console.log(`I am ${this.name} and I am studying ${this.major}.`);
  }
}

这个代码定义了一个名为 Student 的类,它继承自 Person 类。Student 类有两个属性:name 和 age,它们来自 Person 类。此外,Student 类还定义了一个名为 major 的属性,用于存储学生的主修专业。Student 类还定义了一个名为 study 的方法,用于向控制台输出一个学习信息。

我们可以通过以下代码来创建 Student 类