JavaScript 原理

Class 的定义与继承机制

本文深入浅出地讲解 ES6 中的 Class 类,让前端小白轻松掌握面向对象编程技巧。

🎯 引言

掌握 ES6 的 Class 语法后,你就能更优雅地组织前端代码,实现面向对象编程的思想。本文通过实用示例讲解 Class 的定义、继承、方法及静态成员等内容,帮助你理解 ES6 语法的本质,从而写出更易维护、更模块化的代码,提升开发效率。


🚀 什么是 ES6 Class?

在 JavaScript 诞生之初,语言本身是基于原型链(prototype)的,不存在经典的类(class)概念。ES6 引入了 Class 语法,让我们可以用更接近传统面向对象语言(比如 Java、C++)的方式来创建对象和继承。

Class 其实只是语法糖,本质依然是基于原型链实现的。它让代码更清晰,也更容易理解。


🛠️ 如何定义一个 Class?

定义一个 Class 非常简单,只需要用 class 关键字。来看一个简单的例子:

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

    sayHello() {
        console.log(`你好,我是 ${this.name},今年 ${this.age} 岁。`);
    }
}

const person1 = new Person('小明', 18);
person1.sayHello();

这里,constructor 是构造函数,创建实例时会自动调用。sayHello 是定义在原型上的方法,所有实例都共享这段代码。

使用 Class 定义对象时,记得构造函数里的属性要用 this 绑定,方便实例访问。

🌱 继承与子类

Class 支持继承,子类可以继承父类的属性和方法,提升代码复用。

class Animal {
    constructor(name) {
        this.name = name;
    }

    speak() {
        console.log(`${this.name} 在叫`);
    }
}

class Dog extends Animal {
    speak() {
        console.log(`${this.name} 汪汪汪`);
    }
}

const dog = new Dog('旺财');
dog.speak();

这里,Dog 继承 Animal,重写了 speak 方法。调用 dog.speak() 时,输出自定义的“汪汪汪”。

子类中如果要访问父类的方法,使用 super 关键字。例如:
class Dog extends Animal {
    speak() {
        super.speak();
        console.log(`${this.name} 汪汪汪`);
    }
}

🔍 静态方法和静态属性

Class 也可以定义静态方法和属性,它们属于类本身,而不是实例。

class MathUtil {
    static add(a, b) {
        return a + b;
    }
}

console.log(MathUtil.add(2, 3)); // 5

静态方法不能通过实例调用,只能通过类调用。


💡 实战示例:制作一个简单的计数器组件

假设我们要写一个计数器,可以增加、减少和重置计数。

class Counter {
    constructor() {
        this.count = 0;
    }

    increment() {
        this.count++;
        console.log(`计数器加一,当前值:${this.count}`);
    }

    decrement() {
        this.count--;
        console.log(`计数器减一,当前值:${this.count}`);
    }

    reset() {
        this.count = 0;
        console.log(`计数器重置,当前值:${this.count}`);
    }
}

const counter = new Counter();
counter.increment();
counter.increment();
counter.decrement();
counter.reset();

通过 Class,代码层次清晰,行为方法都绑定在 Counter 这个“类”里,很适合封装组件逻辑。


🧾 小节总结:

  1. ES6 Class 是语法糖,本质仍是基于原型链的面向对象实现。
  2. Class 支持继承、静态方法、构造函数,代码更清晰易维护。
  3. 使用 Class 编写组件时,代码结构更合理,行为更集中。

❓ 知识问答(Q&A)

Q:Class 是什么,和函数构造器有什么区别?

A:Class 是 ES6 提供的语法糖,背后还是原型链实现。它让代码更简洁、更接近传统面向对象写法。

Q:如何在子类中调用父类方法?

A:使用 super 关键字调用父类的构造函数或方法。

Q:静态方法和实例方法有什么区别?

A:静态方法属于类本身,实例方法属于类的实例,静态方法不能通过实例调用。


🧪 小练习:

  1. 在 Counter 类中新增一个方法 setCount(value),用来设置计数器的当前值。
class Counter {
    constructor() {
        this.count = 0;
    }

    increment() {
        this.count++;
        console.log(`计数器加一,当前值:${this.count}`);
    }

    decrement() {
        this.count--;
        console.log(`计数器减一,当前值:${this.count}`);
    }

    reset() {
        this.count = 0;
        console.log(`计数器重置,当前值:${this.count}`);
    }

    // 在这里添加 setCount 方法
}
  1. 定义一个类 Shape,包含属性 color 和方法 draw(),继承出 Circle 类,新增属性 radius 并实现 draw(),打印“画一个红色的圆,半径是 10”。
class Shape {
    constructor(color) {
        this.color = color;
    }

    draw() {
        console.log(`画一个颜色是${this.color}的形状`);
    }
}

// 继承 Shape,实现 Circle 类

🎉 恭喜你已经掌握 ES6 Class 类、继承和静态方法技能啦!面向对象编程从此不再难懂,继续练习,你就是前端高手!