class类的概念

类适用于 创建对象 模板。同时类声明也会引入一个新类型,可定义其 实例属性、方法和构造函数
类名 首字母大写(规范)

class 类名{
  //字段名、类型、初始值
  字段名1: 类型 = 'xxx'
  //可选字段可以不设置初始值;使用时需要配合 可选链操作符 避免出错
  字段名2?: 类型
}
//创建类的对象
let 对象名: 类名 = new 类名()

注:‘?’ 表示可选链操作符,若有值,则会正常输出,无值时输出其本身(undefined)

构造函数

  • 希望不同的实例,有不同的字段初始值时,使用构造函数
  • 通过new实例化的时候,会调用 constructor
  • 通过关键字 this 可以获取到实例对象
constructor(name: string, price: number) {
    this.name = name
    this.price = price
  }

注:构造器内也可以传入整个对象,且可以不管传参的顺序,因为接口已经定义好了。

类中方法

类中可以定义方法,并在内部编写逻辑

例如:

sayHi(yourName: string){
  //通过this可以访问到创建出来的实例对象
  console.log(`hello,${yourName},我是${this.name}`)
}

sing(): string{ //也可以加类型,但是需要有返回值
  return '稻香'
}

静态属性和方法

类 还可以添加静态属性、方法,后续访问需要通过 类 来完成

静态属性方法是给 类 添加的(属于类的),哪怕不创建对象,也可以使用。

static version: string = 'v2.0'
static vv: string
static getRandom(){
  return Math.random()
}
//使用时
类.version //不需要实例化类

类的继承(重写)

继承 extends super 关键字

类可以通过继承快速获取另一个类的字段和方法

子类通过extends关键字继承父类

重写父类的方法直接写同名的方法,在其中编写新内容即可

class Student extends Person{
  //子类中如果想有自己独有的属性和方法
  grade: string
  study() {
    console.log('好好学习,天天向上!')
  }

  constructor(name: string, age: number, grade: string) {
    //父类中的构造函数,此时需要我们手动调用
    //super() 访问父类的构造函数;super.方法名() 访问父类的方法;super.属性名 访问父类的属性
    super(name, age)
    //完成自己属性的初始化
    this.grade = grade
  }

  //子类中想要重写父类中的方法,只需提供同名的方法即可
  sayHi(): void {
    super.sayHi()
    super.name //获取父类的属性 (获取属性时,最好不要使用,如果要用,需要用this.xxx代替,否则获取不到值)
    super.age //获取父类的属性
    console.log(this.name) //此处不要用super.name,会无法获取到值!
    console.log(`hello,nice to meet you !`) //在父类方法的基础上再进行扩展
  }
}

子类构造函数中需要使用super关键字将传进来的参数传递给父类构造函数

修饰符

修饰符(readonly、private...)
类的方法和属性 可以通过修饰符来 限制 访问
包括:readonly、private、protectedpublic。省略默认是public

readonly

  • 只可以取值,无法修改值
readonly legs: number = 4
c1.legs = 6 //不能修改!!!

private

  • 修饰的成员不能在声明该成员的类之外访问,包括子类
  • 若要使用private修饰的成员,必须使用get和set方法

protected

  • protected修饰符和private很像,不同的是protected修饰的成员允许在派生类(子类)中访问,但不能再外部访问

public(默认)

所修饰的成员在程序任何可访问该类的地方都可见。

类型检测

typeof

  • 仅能用于判断简单类型,复杂类型要用instanceof判断
typeof 111 //输出是number类型

instanceof

  • 检测某个对象是否是某个类的实例
//可用instanceof判断是否能访问到后面的类中提供的属性和方法
class Person{}
let p: Person = new Person()
console.log('判断结果1:', p instanceof Person) //判断 对象 是否为某个类的实例

注:

  • 上面的“p”这种对象不可用typeof判断类型!
  • instanceof亦可以判断是否为数组类型。

接口的继承和实现

接口的继承

接口继承也使用extends关键字

需要继承的接口只需要添加新的成员变量和类型即可,依然可以当做对象使用

interface IAnimal {
  name: string
  age: number
}
interface IDog extends  IAnimal {
  color: string
}

接口的实现

主要用于约束类,通过结合 implements 来限制 类 必须要有的 某些属性 和 方法。类依然可以有更多的属性或方法,但是必须要有所实现接口中的属性和方法

interface IDog {
  name: string
  age: number
  jump:() => void
}
class Dog implements IDog {
  name: string
  age: number
  desc: string //自己的属性
  jump(){}
}
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐