【09】纯血鸿蒙HarmonyOS NEXT星河版开辟0底子学习条记-Class类底子全解( ...

打印 上一主题 下一主题

主题 629|帖子 629|积分 1887

序言:

本文具体讲解了关于我们在步伐设计中所用到的class类的各种参数及语法。
笔者也是跟着B站黑马的课程一步步学习,学习的过程中添加部分本身的想法整理为条记分享出来,如有代码错误或笔误,欢迎指正。
B站黑马的课程链接:鸿蒙课程先容_哔哩哔哩_bilibili
往期条记:

【01】纯血鸿蒙HarmonyOS NEXT星河版开辟0底子学习条记-ArkTs底子语法与界面开辟底子
【02】纯血鸿蒙HarmonyOS NEXT星河版开辟0底子学习条记-界面进阶与布局排布(附QQ登陆、得物、京东登陆综合案例+代码)
【03】纯血鸿蒙HarmonyOS NEXT星河版开辟0底子学习条记-更多布局(弹性/层叠)方式与界面开辟综合(附飞狗卡片+B站卡片案例+实战开辟付出宝界面+代码)
【04】纯血鸿蒙HarmonyOS NEXT星河版开辟0底子学习条记-ArkTs进阶运算符+状态管理(附综合案例美团购物车)
【05】纯血鸿蒙HarmonyOS NEXT星河版开辟0底子学习条记-条件渲染+if/switch判定与for/while循环(附计数器、京东加购案例)
【06】纯血鸿蒙HarmonyOS NEXT星河版开辟0底子学习条记-综合案例·生肖抽奖卡具体实现(类似付出宝集五福)
【07】纯血鸿蒙HarmonyOS NEXT星河版开辟0底子学习条记-Swiper轮播组件与样式&布局重用  
【08】纯血鸿蒙HarmonyOS NEXT星河版开辟0底子学习条记-Scroll容器与Tabs组件
目录

一.Class类
1.class类-属性方法
2.class类-构造函数
3.class类-定义方法&静态方法&静态属性
4.class类-继承extends和super关键字
5.class类-instanceof和typeof
6.class类-类的修饰符


一.Class类

1.class类-属性方法

1)简介:
类是用来 创建对象 模板。
同时类声明也会引入一个 新范例,可定义其 实例属性、方法和构造函数。
2)实例属性:
①用法:
  1. class 类名{
  2.   //1.实例属性(字段)
  3.   //字段名、类型、初始值
  4.   字段名1:类型='xxx'
  5.   //可选字段可以不设置初始值
  6.   字段名2?:类型
  7.   //2.构造函数
  8.   //3.方法
  9. }
  10. //使用类 实例化对象 基于类 创建对象
  11. //可选字段在使用时需要配合使用 可选链操作符 避免出错
  12. const p:类名 = new 类名()
  13. p.字段名1
  14. p?.字段名2
复制代码
②实例代码:
  1. class Cat{
  2.   name:string = 'Tom'
  3.   foods?:string
  4. }
  5. //基于类,创建对象
  6. let c:Cat = new Cat()
  7. c.name = '河马'
  8. console.log('姓名',c.name)
  9. console.log('食物',c.foods?.length)
  10. //这个问号的意义在于,如果food真的有值则取其长度,如果没有值就取food本身,即为空
  11. let z:Cat = new Cat()
  12. z.name = '荷花'
  13. z.foods = '河马'
  14. console.log('姓名',z.name)
  15. console.log('食物',z.foods?.length)
复制代码


2.class类-构造函数

1)简介:
不同实例,将来需要有不同的字段初始值,就需要通过构造函数实现。

2)基本语法:
  1. class 类{
  2.   字段A:类型
  3.   字段B:类型
  4.   constructor(参数...) {
  5.     //通过new 实例化的时候 会调用constructor
  6.     //通过关键字this 可以获取到实例对象
  7.   this.字段A = 参数
  8.   }
  9. }
  10. const 实例化1 = new 类(参数...)
  11. const 实例化2 = new 类(参数...)
复制代码


3)底子实例代码:
  1. class Food{
  2.   name:string
  3.   price:number
  4. //希望有不同实例,有不同的字段初始值->构造函数
  5.   constructor(name:string,price:number) {
  6.     this.name=name
  7.     this.price=price
  8.   }
  9. }
  10. const f1 = new Food('西红柿鸡蛋',15)
  11. const f2 = new Food('土豆炖鸡块',24)
  12. console.log('名称:',f1.name,'价格:',f1.price)
  13. console.log('名称:',f2.name,'价格:',f2.price)
复制代码


4)进阶实例代码:
加入了一个interface接口,基于接口方便定义实例参数(无需按照次序进行输入)
  1. interface IFood{
  2.   name:string
  3.   price:number
  4.   desc:string
  5. }
  6. class Food{
  7.   name:string
  8.   price:number
  9.   desc:string
  10.   //希望有不同实例,有不同的字段初始值->构造函数
  11.   constructor(paramsObj:IFood) {
  12.     this.name=paramsObj.name
  13.     this.price=paramsObj.price
  14.     this.desc =paramsObj.desc
  15.   }
  16. }
  17. let  p1:Food = new Food({
  18.   name:'西兰花',
  19.   desc:'好吃',
  20.   price:188
  21. })
  22. let  p2:Food = new Food({
  23.   name:'黄瓜炒鸡蛋',
  24.   desc:'清爽',
  25.   price:3688
  26. })
  27. console.log('菜名:',p1.name,'价格:',p1.price,'描述:',p1.desc)
  28. console.log('菜名:',p2.name,'价格:',p2.price,'描述:',p2.desc)
复制代码


3.class类-定义方法&静态方法&静态属性

1)简介:
类中可以定义方法,并且在内部编写逻辑。
  1. class 类名{
  2.   方法名(参数...):返回值类型{
  3.     //逻辑
  4.     //可以通过this获取实例对象
  5. }
  6. }
复制代码


2)实例代码:
  1. class Person{
  2.   name:string
  3.   constructor(name:string) {
  4.     this.name = name
  5.   }
  6. //定义方法
  7.   sayHi(name:string){
  8.     console.log(`你好${name},我是:${this.name}`)
  9.   }
  10. }
  11. const p:Person = new Person('笨猪河马')
  12. //方法调用
  13. p.sayHi('可爱的荷花')
复制代码


3)静态属性和静态方法:
①简介:
静态属性和静态方法不是给我们实例化对象添加的,是给类添加的,比如定义一个数字工具类中会有π=3.14,e=2.71
①语法:
  1. class 类{
  2.   static 字段:类型
  3.   static 方法(){}
  4. }
  5. //使用
  6. 类.字段
  7. 类.方法()
复制代码
②实例代码:
  1. class Robot{
  2.   //如果不设置值,默认是undefined
  3.   static PI:number = 3.14
  4.   static version:string = 'v10.12'
  5.   //工具方法
  6.   static getRandomNumber(){
  7.     return Math.random()
  8.   }
  9. }
  10. //无需实例化对象,直接调用类 没有new 也可以直接用
  11. console.log('机器人版本:',Robot.version)
  12. console.log('生成一个随机数:',Robot.getRandomNumber())
  13. console.log('计算半径为5的圆的面积:',Robot.PI*5*5)
复制代码


4.class类-继承extends和super关键字

1)简介:
我们在实际使用中各个类之间往往会有很多相似之处,比如说猫和狗,都是动物,我们就可以定义一个动物类作为猫类和狗类的父类。比如步伐员和教师都有姓名、年龄、家庭住址、email,只不外能做的职业功能不同,我们就可以添加一个人类(含有姓名、年龄、家庭住址、email四个属性)作为他们的父类。
即把公共部分抽取出来,进行复用,我们的代码就会更加简洁高效。
  1. class 父类{
  2.   //字段
  3.   //方法
  4.   //构造函数
  5. }
  6. class 子类 extends 父类{
  7.   //自己的字段(属性)
  8.   //自己的方法
  9.   //可以重写父类的方法
  10. }
复制代码


2)实例代码:
  1. class Person{
  2.   name:string
  3.   age:number
  4.   constructor(name:string,age:number) {
  5.     this.name=name
  6.     this.age=age
  7.   }
  8.   sayHi(){
  9.     console.log('大家好!','我叫',this.name,'今年',this.age,'岁')
  10.   }
  11. }
  12. class Student extends Person{
  13.   grade:string
  14.   constructor(name:string,age:number,grade:string) {
  15.     //父类中的构造函数需要我们手动调用,子类可以访问父类的实例字段、实例方法和构造函数
  16.     //此时需要手动调用super()构造函数,super.方法名() super.属性名
  17.     super(name,age)
  18.     //完成自己属性的初始化
  19.     this.grade=grade
  20.   }
  21.   //子类中想要重写父类的方法,只需要提供同名的方法即可
  22.   //比如学生想展示一下自己的英文水平
  23.   sayHi(): void {
  24.     console.log('Hello!','My name is',this.name,'Now year',this.age,',我的年级是',this.grade)
  25.   }
  26.   study(){
  27.     console.log('我是学生,我爱学点小习')
  28.   }
  29. }
  30. let s1:Student = new Student('河马',74,'大四')
  31. s1.sayHi()
  32. console.log('今年',s1.grade)
  33. s1.study()
  34. class Teacher extends Person{
  35. }
  36. let t1:Teacher=new Teacher('大卑老师',9999)
  37. t1.sayHi()
  38. class Worker extends Person{
  39. }
  40. let w1:Worker=new Worker('修水管的师傅',41)
  41. w1.sayHi()
复制代码

tips:关于super(),子类可以通过super访问父类的实例字段、实例方法和构造函数。

5.class类-instanceof和typeof

1)简介:
instanceof运算符可以用来检测某个对象是否是某个类的实例

typeof只能用于判定简朴范例,如Boolean、string、number等简朴范例

2)typeof实例代码:
  1. console.log(typeof 111)
  2. console.log(typeof true)
  3. console.log(typeof 'abc')
  4. class Person{
  5. }
  6. class Student extends Person{
  7. }
  8. let p:Person = new Person()
  9. let s:Student = new Student()
  10. console.log(typeof p)
  11. console.log(typeof s)
复制代码

我们在日志中会发现typeof判定简朴范例都可以直接体现其范例,但用typeof去判定p和s会体现object

3)instanceof实例代码:
①需求:
定义一个父类→定义子类并继承父类→实例化子类并通过instanceof进行判定→判定命组是否为Array的实例
②代码:
  1. class Person{
  2. }
  3. class Student extends Person{
  4. }
  5. class Worker{
  6. }
  7. let s:Student = new Student()
  8. console.log('s和Student类的instanceof判断结果:',s instanceof Student)
  9. console.log('s和Person类的instanceof判断结果:',s instanceof Person)
  10. console.log('s和Worker类的instanceof判断结果:',s instanceof Worker)
复制代码

③判定命组代码:
  1. interface IObj{}
  2. //判断一个变量是否存的是数组
  3. let temp=[]
  4. let temp2:IObj={}
  5. //普通对象可以用数组判断
  6. console.log('temp1是否是数组',temp instanceof Array)
  7. //如果是调temp2这种接口里的方法就不能用数组去判断
  8. console.log('temp2是否是数组',temp2 instanceof Array)
复制代码


6.class类-类的修饰符

1)简介:
类的属性和方法可以通过修饰符来限制访问
修饰符包括:readonly、private、protected和public
省略不写默认为public

2)readonly实例代码:
  1. class Cat{
  2.   name:string
  3.   age:number
  4.   readonly legs:number=4
  5.   constructor(name:string,age:number) {
  6.     this.name=name
  7.     this.age=age
  8.   }
  9. }
  10. let c1=new Cat('小花',2)
  11. c1.name='小美'
  12. c1.legs=6 //会报错
  13. console.log('姓名',c1.name)
复制代码


3)private实例代码:
  1. class Person{
  2.   private name:string=''
  3.   private age:number=0
  4. }
  5. class Student extends Person{
  6.   sayHi(){
  7.     console.log('访问私有的数据:',super.name)
  8. //私有数据无法在外部(子类)中访问
  9.   }
  10. }
复制代码


4)protected修饰符
①简介:
protected修饰符的作用与private修饰符非常相似
不同点是protect修饰的成员答应在派生类(子类)中访问
②代码演示:
  1. class Person{
  2.   protected  name:string=''
  3.   private age:number=0
  4. }
  5. class Student extends Person{
  6.   sayHi(){
  7.     console.log('访问私有的数据:',super.name)
  8.   }
  9. }
复制代码

用protected定义父类的name,一样的代码就可以访问了。
但是在外部访问,一样不答应访问。
  1. class Person{
  2.   protected  name:string=''
  3.   private age:number=0
  4.   constructor(name:string,age:number) {
  5.     this.name=name
  6.     this.age=age
  7.   }
  8. }
  9. class Student extends Person{
  10.   sayHi(){
  11.     console.log('访问私有的数据:',super.name)
  12.   }
  13. }
  14. let s1:Student =new Student('小华',18)
  15. //外部
  16. console.log('外部访问保护的数据:',s1.name)
复制代码

感谢阅读。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表