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

ES6:类的基本知识

基本语法:

// 创建一个Person类
class Person {
 // 构造器方法
  constructor(name,age){
    this.name = name
    this.age = age
  }
}
let p1 = new Person('jack',16)
let p2 = new Person('tom',18)
console.log('p1:',p1) // p1:,{"name":"jack","age":16}
console.log('p2:',p2) // p2:,{"name":"tom","age":18}

输出:

 添加Person行为(方法):

// 创建一个Person类
class Person {
 // 构造器方法
  constructor(name,age){
    this.name = name
    this.age = age
  }
  // 定义一般方法
  speak() {
    console.log(`我是${this.name},我的年龄:${this.age}`)
  }
}
let p1 = new Person('jack',16)
let p2 = new Person('tom',18)
console.log('p1:',p1.speak()) 
console.log('p2:',p2.speak())

以上代码的结论:

  • speak方法实际定义在哪里了?--放在了类的原型上
  • 通过person实例调用,speak里面的this就是person实例

继承

再定义一个student类

// 创建一个Person类
class Person {
 // 构造器方法
  constructor(name,age){
    this.name = name
    this.age = age
  }
  // 定义一般方法
  speak() {
    console.log(`我是${this.name},我的年龄:${this.age}`)
  }
}

class Student extends Person {}
const student = new Student('cat',20)
console.log(student.speak())  // 我是cat,我的年龄:20

super是什么?

用于在子类Student的构造函数中调用,其作用是直接调用父级Person类中的构造函数,让其this上拥有name和age属性,代码:

// 创建一个Person类
class Person {
 // 构造器方法
  constructor(name,age){
    this.name = name
    this.age = age
  }
  // 定义一般方法
  speak() {
    console.log(`我是${this.name},我的年龄:${this.age}`)
  }
}

class Student extends Person {
 constructor(name,age,grade) {
   // 必须写首行,执行父级构造器函数
   super(name,age)
   this.grade = grade
 }
}
const student = new Student('cat',20,'初三')
console.log(student.speak())  // 我是cat,我的年龄:20

总结

  • 类中的构造器不是必须要写的,要对实例进行初始化操作,如添加属性时才写构造器
  • 如果 A类继承了B类,而且A类中写了构造器,那么A类构造器中的super是必须要调用的
  • 类中定义的方法,都是放在了类的原型对象上,供实例去使用
  • 类中定义的方法中,打印this,如果这个方法是通过实例对象调用,则this是这个实例对象,反之为undefined
  • 注意:在类的语句{}中,只能定义方法和定义实例对象的属性(直接写赋值语句:如a=123),但是不能直接在类的语句中写声明变量如let a = 123,也不能直接打印console.log(),这一点和函数体语句最大的区别

相关文章:

  • 再议:通用功能页面的组件化编码流程
  • React: 样式模块化
  • React:类式组件
  • React: 深入类中this对象的理解
  • React: state和setState理解
  • React: 函数式组件如何使用props
  • VSCode在代码处显示提交记录
  • 如何去除谷歌的人机身份验证
  • git修改用户名及邮箱
  • git撤销commit 并保存之前的修改
  • git merge和git rebase区别
  • git rebase实战操作
  • mac系统如何更改用户名及头像
  • internal/modules/cjs/loader.js:883 throw err;
  • Node: 001全局对象和模块化-如何给node传递参数?
  • ES6简单总结(搭配简单的讲解和小案例)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Making An Indicator With Pure CSS
  • vue 配置sass、scss全局变量
  • 程序员该如何有效的找工作?
  • 欢迎参加第二届中国游戏开发者大会
  • 简单易用的leetcode开发测试工具(npm)
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 我是如何设计 Upload 上传组件的
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • #162 (Div. 2)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (07)Hive——窗口函数详解
  • (C语言)逆序输出字符串
  • (vue)页面文件上传获取:action地址
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (轉貼) UML中文FAQ (OO) (UML)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .net 7 上传文件踩坑
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @31省区市高考时间表来了,祝考试成功
  • @EnableAsync和@Async开始异步任务支持
  • @拔赤:Web前端开发十日谈
  • [ C++ ] STL---string类的使用指南
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [C#]winform部署PaddleOCRV3推理模型
  • [C++]C++基础知识概述
  • [C++]高精度 bign (重载运算符版本)
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
  • [daily][archlinux][game] 几个linux下还不错的游戏
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档