• TS复习-----TS中的类


    目录

    概述

    类的定义

    类的继承

    类的静态方法和属性

    类里面的修饰符

    抽象类

     多态

    getters与setters

    readonly修饰符


    概述

    • 类(Class):定义了一切事物的抽象特点
    • 对象(Object):类的实例
    • 面向对象(OOP)三大特性:封装继承多态

    类的定义

    1. // 定义类
    2. class Person {
    3. // 公共属性,默认可以不写
    4. public name: string
    5. // 构造函数
    6. constructor(name: string) {
    7. // 初始化name属性
    8. this.name = name
    9. }
    10. }
    11. // 实例化类
    12. const person = new Person('zs')
    13. console.log(person.name) // zs

    类的继承

    在面向对象的编程语言中,有一个重要得特征就是继承。继承就是基于某个类来扩展现有的类。

    例如,爸爸在北京有一个四合院,儿子可以继承爸爸的四合院,而且还可以自己去买一栋别墅;最终儿子的房产拥有北京的四合院和一栋别墅。

    TypeScript中类的继承需要通过extends来配合super来实现。子类若要继承父类的属性和方法需要执行一次super(),它代表实例化父类的构造函数,super() 只能用在子类的构造函数之中,用在其他地方就会报错。

    1. // 定义一个基类,又称超类
    2. class Father {
    3. // 在基类中定义一个name属性
    4. public name: string
    5. constructor(name: string) {
    6. this.name = name
    7. }
    8. }
    9. // 定义一个派生类,又称子类,继承于基类
    10. class Son extends Father {
    11. constructor(name: string, public age: number) {
    12. // 通过 super 调用基类的构造函数
    13. super(name)
    14. }
    15. getInfo(): void {
    16. console.log(this.name); //ZS
    17. console.log(this.age); //18
    18. }
    19. }
    20. const a = new Son('ZS', 18)
    21. a.getInfo()

    类的静态方法和属性

    静态属性和静态方法属于类自身,而不属于实例,访问的时候要用类名访问,而不能用实例对象访问。在 TS中定义静态成员与ES6中一样,都是使用static关键字来说明。

    1. class Hero {
    2. static count = 0
    3. constructor(public name: string) {
    4. // 每创建一个属性 count ++
    5. ++Hero.count
    6. }
    7. }
    8. const hero1 = new Hero('孙悟空')
    9. console.log(Hero.count) // 1
    10. const hero2 = new Hero('哪吒')
    11. console.log(Hero.count) // 2
    12. // console.log(hero1.count);不能访问静态成员count

    类里面的修饰符

    TypeScript定义属性的时候给我们提供了三种修饰符:

    • public:公有属性,在当前类里面、 子类 、类外面都可以访问。属性如果不加修饰符默认就public
    • protected:保护类型,在当前类里面、子类里面可以访问 ,在类外部没法访问。
    • private:私有属性,在当前类里面可以访问,子类、类外部都没法访问。
    1. class Person {
    2. public name: string
    3. // 约定 私有成员一般采用 _ 开头
    4. private _age: number
    5. protected hobby: string
    6. // 属性初始化
    7. constructor(name: string, age: number, hobby: string) {
    8. this.name = name
    9. this._age = age
    10. this.hobby = hobby
    11. }
    12. sayMy() {
    13. console.log(this.name, this._age, this.hobby)
    14. }
    15. }
    16. // 实例化 Person 类
    17. const person = new Person('zs', 18, 'coding')
    18. console.log(person.name) // zs
    19. // console.log(person._age) // 报错 类外访问私有成员 抛出异常
    20. // console.log(person.hobby) // 报错 类外访问保护成员 抛出异常
    21. person.sayMy() // zs 18 coding,private 成员和 protected 成员可以在类内访问
    22. // 定义一个类继承与 Person 类
    23. class Programmer extends Person {
    24. constructor(name: string, age: number, hobby: string) {
    25. super(name, age, hobby)
    26. }
    27. sayMy() {
    28. console.log(this.name) // zs
    29. // console.log(this._age) // 报错 在子类不可以访问父类的私有成员
    30. // console.log(this.hobby) // coding 在子类不可以访问父类的私有成员
    31. }
    32. }
    33. // 实例化 Programmer 类
    34. const programmer = new Programmer('zs', 18, 'coding')
    35. programmer.sayMy()


    抽象类

    概念

    • 想要理解什么是抽象类,就需要先理解什么是抽象,所谓的抽象就是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征 。例如苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。
    • 抽象类就是将众多类中具有共同部分的功能抽离出来,单独创建一个类作为其他派生类的基类使用。他们不允许被实例化,定义抽象类使用abstract关键字。
    • 抽象方法就是只有方法的定义,没有方法体,方法体需要在子类中进行实现。
    1. // 通过 abstract 关键字 定义一个抽象类,该类不必进行初始化,仅作为基类使用
    2. abstract class Department {
    3. // 初始化name成员,参数属性
    4. constructor(public name: string) { }
    5. printName(): void {
    6. console.log('部门名称: ' + this.name)
    7. }
    8. // 抽象方法必须包含 abstract 关键字
    9. abstract printMeeting(): void // 必须在派生类中实现
    10. }
    11. class AccountingDepartment extends Department {
    12. constructor() {
    13. super('会计部') // 在派生类的构造函数中必须调用super()
    14. }
    15. printMeeting(): void {
    16. console.log('会计部是负责管钱的部门')
    17. }
    18. }
    19. // const department = new Department() // 抛出异常:不能创建一个抽象类的实例
    20. // 实例化抽象子类
    21. const department = new AccountingDepartment()
    22. // 调用抽象类中的方法
    23. department.printName() // 部门名称: 会计部
    24. // 调用在派生类实现的抽象方法
    25. department.printMeeting() // 会计部是负责管钱的部门

     多态

    多态属于继承,是继承的一种延续,在父类内部有一个公用方法,但是不知道具体做什么,由多个子类继承同一个方法,实现不同效果,这个公用方法也叫方法的重写

    1. class Animall {
    2. name: string;
    3. constructor(name: string) {
    4. this.name = name
    5. }
    6. eat(): void {
    7. console.log('我们都可以吃');
    8. }
    9. }
    10. class Dog extends Animall {
    11. constructor(name: string) {
    12. super(name)
    13. }
    14. eat(): void {
    15. console.log(`${this.name}吃骨头`)
    16. }
    17. }
    18. class Cat extends Animall {
    19. constructor(name: string) {
    20. super(name)
    21. }
    22. eat(): void {
    23. console.log(`${this.name}吃老鼠`)
    24. }
    25. }
    26. let dog = new Dog('小黄')
    27. dog.eat()

    getters与setters

    类中的私有成员和保护成员我们并不是真的不能读写,在TS中提供了getterssetters帮助我们有效的控制对对象成员的访问。

    1. // 定义一个 Person 类
    2. class Person {
    3. // 约定 私有成员一般采用 _ 开头
    4. private _name: string
    5. // 属性初始化
    6. constructor(name: string) {
    7. this._name = name
    8. }
    9. // 获取 私有的 _name 属性值
    10. get getName(): string {
    11. return this._name
    12. }
    13. // 设置 私有的 _name 属性值
    14. set setName(name: string) {
    15. this._name = name
    16. }
    17. }
    18. // 实例化类
    19. const person = new Person('zs')
    20. console.log(person.getName) // zs 通过 getName 的方式获取
    21. person.setName = 'ls'//通过 setName 的方式设置 _name 的值
    22. console.log(person.getName) // // 重新获取 ls

    readonly修饰符

    我们可以通过 readonly修饰符将一个属性设置为只读的。只读属性必须在声明时或者在构造函数中进行初始化。

    1. // 定义一个类,且具有一个只读属性
    2. class Person {
    3. // readonly name: string
    4. // 等同于
    5. // public readonly name: string
    6. // constructor(name: string) {
    7. // this.name = name
    8. // }
    9. // 或者
    10. constructor(public readonly name: string) { }
    11. }
    12. // 实例化
    13. const person = new Person('zs')
    14. console.log(person.name) // zs
    15. // 修改name的值
    16. // person.name = 'ls' // 错误! name 是只读的.

  • 相关阅读:
    uniApp获取当前位置经纬度
    第三章:最新版零基础学习 PYTHON 教程(第十二节 - Python 运算符—Python 中的运算符函数 - 套装1)
    端口探测详解
    Leetcode -2
    [SQL] union all
    理解什么是接口测试?怎样做接口测试?
    单调栈II: leetcode 581、901、42、84
    强化自主可控,润开鸿发布基于RISC-V架构的开源鸿蒙终端新品
    [附源码]Python计算机毕业设计java高校社团管理系统
    Mybatis的生命周期和作用域
  • 原文地址:https://blog.csdn.net/qq_63358859/article/details/126933274