几个简单的例子学会 ES6 class

简介: 几个简单的例子学会 ES6 class

网络异常,图片无法展示
|


「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战


是什么


classES6 中的一个语法糖结构,底层依然是基于原型和构造函数。何以见得呢?


function Person1(name, age) {
  this.name = name
  this.age = age
}
Person1.prototype.say = function () {
  console.log(`My name is ${this.name},i am ${this.age} years old.`)
}
class Person2 {
  constructor(name, age) {
    this.name = name
    this.age = age
  }
  say() {
    console.log(`My name is ${this.name},i am ${this.age} years old.`)
  }
}
const xiaoming = new Person1('小明', 18),
  xiaohong = new Person2('小红', 20)
console.dir(xiaoming)
xiaoming.say()
console.dir(xiaohong)
xiaohong.say()
复制代码


网络异常,图片无法展示
|


可以看到,两个实例的打印结果基本一致,都有原型,原型中都有构造函数,而且两种写法的 say 都是保存在构造函数的原型上。 而且两者都用 new 操作符进行实例化。


而且此时打印 typeof Person2 的结果是 function。😏


基本使用


class Person {
  constructor(name = 'person', age = 18) {
    this.name = name
    this.age = age
  }
  say() {
    console.log(`My name is ${this.name},i am ${this.age} years old.`)
  }
}
const person = new Person(),
  xiaoming = new Person('小明', 20)
console.dir(person)
person.say()
console.dir(xiaoming)
xiaoming.say()
复制代码


可以看到,使用 new 操作符实例化 Person 类的时候传入的参数会被 constructor 接收并使用,如果不需要传入参数,()可以不写。


static 静态类


假如我们有这样一个场景,要批量生成学生实例,我们可以这样编写 class 类:


class Student {
  constructor(name, age) {
    this.name = name
    this.age = age
    this.school = 'JavaScript 小学'
  }
  say() {
    console.log(`My name is ${this.name},i am ${this.age} years old,my school is ${this.school}.`)
  }
}
const xiaoming = new Student('小明', 18)
xiaoming.say() // My name is 小明,i am 18 years old,my school is JavaScript 小学.
复制代码


但是这样做有一个问题就是 school 是统一的,没有必要在每个实例上保存,造成内存浪费,也不利于维护。


这个时候我们就可以改写代码如下:


class Student {
  constructor(name, age) {
    this.name = name
    this.age = age
  }
  static school = 'JavaScript 小学'
  say() {
    console.log(this)
    console.log(`My name is ${this.name},i am ${this.age} years old,my school is ${Student.school}.`)
  }
}
const xiaoming = new Student('小明', 18)
xiaoming.say() // My name is 小明,i am 18 years old,my school is JavaScript 小学.
复制代码


static 的作用在于: 如果不添加 static,则属性会被保存在实例上,方法保存在类的原型对象上。


添加 static 后,定义的属性和方法都会绑定在 class 类 上的,所以我们可以通过 Student.school 获取和修改 school 的值。


继承


假设我们的学生中有一些同学是短跑运动员,则他们会有相应的技能。


这个时候我们定义运动员类,而运动员同时又是学生,这个时候就可以让运动员类继承学生类,得到学生相应的属性和方法,同时在运动员类中添加运动员应有的属性和方法。


这个时候我们可以改写代码如下:


class Student {
  constructor(name, age) {
    this.name = name
    this.age = age
  }
  static school = 'JavaScript 小学'
  say() {
    console.log(`My name is ${this.name},i am ${this.age} years old,my school is ${Student.school}.`)
  }
}
// 使用 extends 关键字继承父类
class Athlete extends Student {
  constructor(name, age) {
    // 调用父类的 constructor
    super(name, age)
  }
  run() {
    console.log(`I am ${this.name},i am running fast!`)
  }
}
const xiaoming = new Athlete('小明', 18)
xiaoming.say() // My name is 小明,i am 18 years old,my school is JavaScript 小学.
xiaoming.run() // I am 小明,i am running fast!
复制代码


这里要注意的是 super 不能脱离 extends 单独使用,但是子类中可以不调用

super()


还要注意的是不能在 super() 之前使用 this,也就是如果子类要使用 this,则必须调用 super()


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章
|
机器学习/深度学习 存储 安全
数据库模型:层次模型、网状模型、关系模型
数据库模型:层次模型、网状模型、关系模型
|
9月前
|
数据采集 安全 API
使用开源项目和IP代理快速获取谷歌学术论文资源并通过大模型提炼信息
使用开源项目和IP代理快速获取谷歌学术论文资源并通过大模型提炼信息
|
存储 缓存 物联网
个人项目中技术落地的基础入门(3)
个人项目中技术落地的基础入门
229 6
|
机器学习/深度学习 资源调度 算法
深度学习模型数值稳定性——梯度衰减和梯度爆炸的说明
深度学习模型数值稳定性——梯度衰减和梯度爆炸的说明
297 0
|
Windows
Windows 10下Markdown不能显示预览
Windows 10下Markdown不能显示预览 结局办法 下载awesomium的SDK,安装后重启Markdown即可 实测最新版本的SDK不行,建议安装1.
1032 0
|
前端开发 应用服务中间件 数据安全/隐私保护
部署React项目到云服务器(步骤清晰)
部署React项目到云服务器(步骤清晰)
894 0
|
搜索推荐 关系型数据库 MySQL
MySQL安装时常见问题和解决方案【详解】
包含了MySQL安装时常见问题和解决方案,快捷实用
1724 0
MySQL安装时常见问题和解决方案【详解】
|
存储 Linux 数据安全/隐私保护
【Linux取经路】权限管理——还在因为没有权限而头疼?手把手教你修改权限(一)
【Linux取经路】权限管理——还在因为没有权限而头疼?手把手教你修改权限(一)
348 0
|
网络安全 芯片 内存技术
可编程 USB 转串口适配器 UART 转 SPI 应用
GD25Qxx 是四线SPI 接口的 FLASH 芯片,最大容量可达 16Mbytes。板上集成有 GD25Q64 芯片, 每页 256 字节,每扇区 16 页(4k 字节),每块区 256 页(64k),写入前必须先擦除,本芯片支持扇区擦除、块区擦除和整片擦除。
可编程 USB 转串口适配器 UART 转 SPI 应用