TypeScript 类的使用 (三)

类的使用

类本身就可以充当类型,用来描述实例(类类型)
ts 中要求所有的属性,必须先声明再使用(修饰符声明)

class Circle {
    public x: number
    public y: number
    constructor(x:number,y:number) {
        this.x = x
        this.y = y || y
    }
}

constructor 是构造函数,用来构造实例

声明修饰符

  • public 公开属性 (父、子、外界都能访问) 默认值
  • protected 受保护(父、子)
  • private 私有属性(父)
  • readonly 仅读属性 只能初始化赋值,后续不能被修改

直接在constructor参数用public修饰符修饰,不用赋值,会自动赋值

class Animal {
    constructor(public name:string,private age:number,protected a:string, readonly b:string) {}
}
class Dog extends Animal {
    constructor(name:string, age:number, a:string) {
        super(name,age,a)
        this.name = name; // public
        this.age = age;// private
        this.a = a; // protected
        this.b = '123' // readonly只能初始化赋值
    }
}
animal.name = 'dog'  //public

在这里插入图片描述
在这里插入图片描述

注:private 使用 animal["age"] 这种方式可以访问私有属性可以,绕过ts检测 可以使用 #属性名 的方式定义私有属性 是将该定义属性放到了 weakmap 中管理

继承

使用extends关键字用来继承其它类
constructor 中使用 super()调用父类中的 constructor 方法

class Dog extends Animal {
    constructor(name:string, age:number, a:string, b:string) {
        super(name,age,a,b)
        this.name = name; // public
        this.age = age;// private
        this.a = a; // protected
        this.b = '123' // readonly只能初始化赋值
    }
}

在这里插入图片描述

  • 属性访问器

就是在类中定义getset 方法用来获取私有属性和属性赋值(Object.defineProperty)

  • 原型属性

在类中可以定义自己的属性方法,并且可以通过子类重写父类方法

  • 静态属性

用 static 修饰符修饰的方法或变量,可以在子类中获取

class Person {
    static name2:string ='smz' //静态属性
    static getName():string { //静态方法
        return this.name2 //this 指向类本身
    }

    private _age:string = '18'
    constructor(public name:string) {}
    get age():string { // 获取私有属性
        return this._age
    }
    set age(value:string) {// 给私有属性赋值
        this._age = value
    }
    movement(posture: string) { //定义属性方法
        console.log('movement',posture)
    }
}
class Student extends Person {
    constructor(name:string) {
        super(name)
    }
    movement(posture: string) { //子类重写父类方法
        super.movement('听课') // 该super指向实例
        return 'student movement ${posture}'
    }
}
const student = new Student('smz')
student.age = '20' //属性访问器 调用set
console.log(student.age) //属性访问器 调用get
student.movement('run') // 原型方法
console.log(Student.getName()) // 调用父类静态方法 this指向父类

定义一个唯一的类

使用 private 修饰 constructor 构造函数,让该类不能通过 new 实例化
在 单例模式时 使用,定义一个静态属性接收实例,通过一个静态方法暴露该实例,方法内部判断这个静态属性是否为空,
不为空则创建实例,有则直接返回,保证实例只存在一个

class Singleton {
    private static instance:Singleton
    private constructor() {}
    static getInstance():Singleton {
        if (!Singleton.instance) {
            Singleton.instance = new Singleton()
        }
        return Singleton.instance
    }
}
let singleton = Singleton.getInstance()
let singleton2 = Singleton.getInstance()
console.log(singleton === singleton2) // true

抽象类

用 abstract修饰符修饰类

特点:

  • 不能被 new
  • 抽象类中可以创建抽象属性和方法,但是不可以创建抽象静态属性和方法
  • 抽象类中可以拥有具体实现
abstract class Animal2 {
    static habitat:string ='smz'
    abstract eat():void // 一般描述的是原型方法
    abstract play: () => void // 一般描述的是实例方法
    drink() { // 具体实现
        console.log('water')
    }
}
class Cat extends Animal2 {
    public play: () => void = () => {}
    eat() {
        console.log('eat')
    }
}
let dog = new Cat()
console.log(dog)

play 为实例方法,而 eat为原型方法:

请添加图片描述

函数重载

class ToArray {
    convert(value: number): number[] // 属性定义
    convert(value: string): string[] // 属性定义
    convert(value: string | number): string[] | number[] { // 方法实现
        if (typeof value === 'number') {
            return [value]
        } else if (typeof value ==='string') {
            return value.split('').map(Number)
        }
        return value
    }
}
let a = new ToArray()
a.convert(123)
a.convert('smz')
a.convert(true)	

在这里插入图片描述

当传入没有重载的值时,会提示没有重载匹配这个调用,而之前伪重载只是对类型的判断

在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
TypeScript 接口和类是面向对象编程的重要概念之一,它们可以帮助开发者创建更加可维护和可扩展的代码。 接口是一种用来定义对象结构的类型。它可以定义对象的属性、方法、以及函数类型等,但是不会有具体实现。接口可以用来约束函数参数或对象类型。例如: ```typescript interface Person { name: string; age: number; sayHi: () => void; } function greet(person: Person) { console.log(`Hello, my name is ${person.name} and I'm ${person.age} years old.`); person.sayHi(); } ``` 在这个例子中,我们定义了一个 `Person` 接口,它包含了 `name`、`age` 和 `sayHi` 三个属性。接着我们定义了一个 `greet` 函数,它接受一个 `Person` 类型的参数并输出问候语。 类是一种封装了数据和行为的数据类型。它可以通过定义成员变量和成员函数来封装数据和行为,并且可以实例化为对象。例如: ```typescript class Greeter { private greeting: string; constructor(message: string) { this.greeting = message; } public greet() { console.log(`Hello, ${this.greeting}!`); } } const greeter = new Greeter('world'); greeter.greet(); ``` 在这个例子中,我们定义了一个 `Greeter` 类,它包含了一个私有成员变量 `greeting` 和一个公共成员函数 `greet`。在类的构造函数中,我们初始化了 `greeting` 成员变量。接着我们创建了一个 `Greeter` 类的实例,并调用 `greet` 函数输出问候语。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天将降大任于我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值