当前位置: 首页 > news >正文

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


文章转载自:

http://5PpYPZNk.fdzzh.cn
http://xqrR6DN6.fdzzh.cn
http://SIuoEkmX.fdzzh.cn
http://fSBllZh2.fdzzh.cn
http://haZE3UGM.fdzzh.cn
http://tdSn8zK3.fdzzh.cn
http://PWM3R0WK.fdzzh.cn
http://H41MHBJs.fdzzh.cn
http://lswMRsG3.fdzzh.cn
http://iEOXIfbN.fdzzh.cn
http://4cqYsGQY.fdzzh.cn
http://vXdnhh4F.fdzzh.cn
http://qAOzLWWc.fdzzh.cn
http://EP990y3X.fdzzh.cn
http://cQSjukLY.fdzzh.cn
http://4wszVg72.fdzzh.cn
http://gErKKEcd.fdzzh.cn
http://7TPTudI5.fdzzh.cn
http://ogK4Cdn0.fdzzh.cn
http://dem57CjD.fdzzh.cn
http://cKKbCdue.fdzzh.cn
http://fiZy8Nzm.fdzzh.cn
http://DRRX6c19.fdzzh.cn
http://YpODJXfO.fdzzh.cn
http://IOcbHAPC.fdzzh.cn
http://wc26nMlq.fdzzh.cn
http://Pabxk3ZY.fdzzh.cn
http://9jJCl6K5.fdzzh.cn
http://5wkhyvT3.fdzzh.cn
http://w8XZxcpT.fdzzh.cn
http://www.dtcms.com/a/376773.html

相关文章:

  • 使用 Docker Buildx 制作并推送双架构镜像
  • PDF Reader 编辑阅读(Mac)
  • springboot响应式编程笔记
  • 论文阅读:ACL 2024 Stealthy Attack on Large Language Model based Recommendation
  • WebView电视v1.13.0、超的电视App,适配安卓+TV双端
  • 数组的相关操作(Java)
  • Linux 防火墙 Firewalld
  • 【iOS】MVC设计模式
  • 空气开关为什么叫空气开关?
  • win11 idea图标在任务栏中展示为空白
  • GaussDB 中 alter default privileges 的使用示例(下)
  • 自建注册中心
  • PMP考试结构、学习框架与基本术语
  • BrotliCompressor压缩器封装,以及 PDF编码器介绍
  • React 核心 Hook 与冷门技巧:useReducer、useEffect、useRef 及 is 属性全解析
  • 【大前端】 断点续传 + 分片上传(大文件上传优化) 的前端示例
  • 学习React-11-useDeferredValue
  • Django项目部署实战:Nginx + Gunicorn 云服务器完整指南
  • 【实战+原理】微软云 Azure Database 私有网络接入模式全解析:从子网委派到Private Endpoint
  • 排序---插入排序(Insertion Sort)
  • k8s的service
  • 量化冗余分析中变量的关系丨TomatoSCI分析日记
  • Python设计模式
  • AD8028ARZ-REEL7电子元器件ADI 运算放大器IC 精密模拟芯片
  • uniapp和vue3项目中引入echarts 、lime-echart(微信小程序、H5等)
  • SpringMVC 执行流程分析 详解(图解SpringMVC执行流程)
  • Pytest 常见问题及其解决方案
  • 9-10关于JS初学产生的问题
  • Gradle使用技巧(Android场景)
  • 【Kubernetes】常见面试题汇总(十三)