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 开发的基础技能之一。

相关推荐
红树林0718 小时前
BeautifulSoup 的页面中需要获取某个元素的 xpath 路径
前端·python·网络爬虫·beautifulsoup
三小河18 小时前
教你发布一个npm的组织包
前端
用户61204149221318 小时前
使用JSP+Servlet+JavaBean做的课程后台管理系统
java·javascript·mysql
青椒a18 小时前
002.nestjs后台管理项目-数据库之prisma(上)
前端
米诺zuo18 小时前
react 中的useContext和Provider实践
前端·react.js
AnalogElectronic18 小时前
vue3 实现贪吃蛇手机版01
开发语言·javascript·ecmascript
asdfsdgss18 小时前
Angular CDK 自适应布局技巧:响应式工具实操手册
前端·javascript·angular.js
袁煦丞19 小时前
【私人导航员+内网穿透神器】Sun-Panel × cpolar让NAS变身你的数字管家:cpolar内网穿透实验室第564个成功挑战
前端·程序员·远程工作
爱吃的强哥19 小时前
Electron_Vue3 自定义系统托盘及退出二次确认
前端·javascript·electron
袁煦丞19 小时前
开启SSH后,你的NAS竟成私有云“变形金刚”:cpolar内网穿透实验室第645个成功挑战
前端·程序员·远程工作