ES6 类与继承:现代 JavaScript 面向对象编程

在 ES6(ECMAScript 2015)之前,JavaScript 中并没有真正意义上的类概念,开发者通常使用构造函数和原型链来模拟面向对象编程。ES6 引入了 class 关键字,为我们提供了更简洁、更接近传统面向对象语言的语法来创建类和实现继承。

如何声明一个 ES6 类

ES6 中使用 class 关键字来声明一个类,基本语法如下:

javascript

运行

复制代码
class Person {
  // 构造方法
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  
  // 实例方法
  sayHello() {
    console.log(`Hello, my name is ${this.name}`);
  }
  
  // 另一个实例方法
  getAge() {
    return this.age;
  }
  
  // 静态方法
  static createPerson(name, age) {
    return new Person(name, age);
  }
}

类的基本组成部分

  1. 类名:按照惯例,类名使用帕斯卡命名法(首字母大写)
  2. 构造方法(constructor)
    • 每个类只能有一个 constructor 方法
    • 当创建类的实例时,会自动调用该方法
    • 如果没有显式定义,会默认添加一个空的构造方法
  3. 实例方法:定义在类中的方法,会成为实例的原型方法
  4. 静态方法 :使用 static 关键字声明,属于类本身,而不是实例

创建类的实例

使用 new 关键字来创建类的实例:

javascript

运行

复制代码
// 创建实例
const person1 = new Person("Alice", 30);
person1.sayHello(); // 输出: Hello, my name is Alice
console.log(person1.getAge()); // 输出: 30

// 使用静态方法创建实例
const person2 = Person.createPerson("Bob", 25);
person2.sayHello(); // 输出: Hello, my name is Bob

类的继承

ES6 中使用 extends 关键字实现类的继承,让一个类可以继承另一个类的属性和方法。

基本继承语法

javascript

运行

复制代码
// 父类
class Animal {
  constructor(name) {
    this.name = name;
  }
  
  eat() {
    console.log(`${this.name} is eating`);
  }
  
  sleep() {
    console.log(`${this.name} is sleeping`);
  }
}

// 子类继承父类
class Dog extends Animal {
  constructor(name, breed) {
    // 调用父类的构造方法
    super(name);
    this.breed = breed;
  }
  
  // 重写父类方法
  eat() {
    console.log(`${this.name} (a ${this.breed}) is eating dog food`);
  }
  
  // 子类特有方法
  bark() {
    console.log(`${this.name} is barking: Woof! Woof!`);
  }
}

继承中的关键概念

  1. extends 关键字:用于声明子类继承自哪个父类
  2. super 关键字
    • 在子类构造方法中,必须先调用 super() 才能使用 this
    • super() 会调用父类的构造方法
    • 可以使用 super.methodName() 调用父类的方法

使用继承的示例

javascript

运行

复制代码
// 创建子类实例
const myDog = new Dog("Buddy", "Golden Retriever");

// 调用继承的方法
myDog.sleep(); // 输出: Buddy is sleeping

// 调用重写的方法
myDog.eat(); // 输出: Buddy (a Golden Retriever) is eating dog food

// 调用子类特有方法
myDog.bark(); // 输出: Buddy is barking: Woof! Woof!

继承的高级用法

继承静态方法

子类会继承父类的静态方法:

javascript

运行

复制代码
class Parent {
  static staticMethod() {
    return "This is a static method";
  }
}

class Child extends Parent {
  // 子类自动继承静态方法
}

console.log(Child.staticMethod()); // 输出: This is a static method

继承内置对象

ES6 类可以继承 JavaScript 内置对象,如 Array、Object 等:

javascript

运行

复制代码
class MyArray extends Array {
  // 自定义方法
  first() {
    return this[0];
  }
  
  last() {
    return this[this.length - 1];
  }
}

const arr = new MyArray(1, 2, 3, 4);
console.log(arr.first()); // 输出: 1
console.log(arr.last());  // 输出: 4
console.log(arr.join('-')); // 输出: 1-2-3-4 (继承 Array 的方法)

总结

ES6 引入的类和继承机制为 JavaScript 面向对象编程带来了以下好处:

  1. 语法更简洁清晰,更接近传统面向对象编程
  2. 继承实现更加直观,通过 extends 关键字即可
  3. 提供了 super 关键字,简化了对父类的访问
  4. 更好的代码组织和可读性

虽然 ES6 类在底层仍然基于原型链实现,但它提供了更友好的语法糖,使我们能够更专注于代码逻辑而非实现细节。掌握 ES6 类和继承是现代 JavaScript 开发的基础技能之一。

相关推荐
是上好佳佳佳呀40 分钟前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
莎士比亚的文学花园1 小时前
Linux驱动开发(3)——设备树
开发语言·javascript·ecmascript
CDN3601 小时前
排查实录:网站偶发502/504错误?360CDN回源超时配置与日志分析技巧
前端·数据库
之歆2 小时前
Day07_CSS盒子模型 · 样式继承 · 用户代理样式
前端·css
01漫游者2 小时前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
DanCheOo2 小时前
AI 应用的安全架构:Prompt 注入、数据泄露、权限边界
前端·人工智能·prompt·安全架构
We་ct3 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
weixin_427771613 小时前
前端调试隐藏元素
前端
threelab3 小时前
Three.js 代码云效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
爱上好庆祝4 小时前
学习js的第五天
前端·css·学习·html·css3·js