class类的

112 阅读3分钟

静态属性 static

class Person{
    enum Gender{
        Male,
        Famale
    }
    static name: string = '熏悟空';// 静态属性 类属性
    age: number = 12 // 实例属性
    readonly gender: Gender = Gender.Male
}

console.log(Person.name) //类调用
let per = new Person()
console.log(per.age) //实例调用

构造函数

class Dog{
    //构造函数会在对象创建时调用
    constructor(name: string, age: number){
        //this表示当前的实例
        this.name = name
        this,age = age
    }
    name: string
    age: number
}

const dog1 = new Dog('小白',3)
const dog2 = new Dog('小黑',6)

继承 && super

在继承时,子类的constructor函数中必须调用super,∵如果不调用super,子类的constructor将覆盖父类的constructor操作,继而报错(语法报错)。

在调用super时,必须将父类需要的参数传过去

class Cat{
    constructor(name: string, age: number){
        //this表示当前的实例
        this.name = name
        this,age = age
    }
    name: string
    age: number
    speak(){
        console.log('汪汪汪')
    }
}
class Dog{
    constructor(name: string, age: number){
        //this表示当前的实例
        this.name = name
        this,age = age
    }
    name: string
    age: number
    speak(){
        console.log('喵喵喵')
    }
}

const dog = new Dog('旺财',13)
const cat = new Cat('咪咪',3)

以上代码中才 Cat 类和 Dog 类的代码过于雷同,可以创建一个父类Animal,Cat,Dog继承Animal即可

class Animal{
    constructor(name: string,age: number){
        this.name = name
        this.age = age
    }
    name: string
    age: number
    speak(msg: string): void{
        console.log(msg)
    }
}
class Dog extends Animal{
    //Dog新增的方法
    run(){
        console.log('狗在跑!')
    }
    //对父类的speak重写,直接覆盖🚩🚩🚩
    speak(){
        //super是当前类的父类🚩🚩🚩
        super.speak('汪汪汪')
    }
}
class Cat extends Animal{
    //父类中有constructor,子类也有construcor时,子类必须嗲用super(),
    // 因为,如果不调用,子类的constructor将会覆盖父类的constructor操作, 则报错🚩🚩🚩
    //调用super时 必须将父类中constructor需要的参数传过去🚩🚩🚩
    constructor(name: string,age: number){
        super(name, age)//调用父类的constructor
    }
}
const dog = new Dog('旺财',13)
const cat = new Cat('咪咪',3)

抽象类 abstract

抽象类不能用来创建对象,抽象类专门用于被继承

抽象类中可以添加抽象方法,抽象方法没有方法体,只能定义在抽象类中,子类必须对抽象方法进行重写

//以上代码中的Animal类即可被定义为抽象类
abstract class Animal{
    constructor(name: string,age: number){
        this.name = name
        this.age = age
    }
    name: string
    age: number
    //抽象方法,子类必须重写
    abstract speak(): void 
}

public:可以在任意位置访问(修改)默认值

private:私有属性,只能在构造函数(类)内部进行访问(修改)

通过在类中添加方法使得私有属性可以被外部方法访问(修改)

protected:受包含的属性,只能在当前类和当前类的子类中访问(修改)

子类继承时,在子类中可以访问,子类的实例对象不能访问

public

class P{
    //可以直接将属性定义在构造函数中,不用再写this.name = name ,this.age = age
    constructor(public name: string, public age: number){
    }
}

//以上代码等同于以下代码

class P{ 
    name: string
    age: number
    
    constructor(name: string, age: number){
        this.name = name
        this.age = age
    }
}

private

class Person{
    public name: string
    private gender: string//私有属性:只能在类内部访问修改,但是外部可以通过类的方法进行间接访问
    
    constructor(name:string, gender:string){
        this.name = name
        //类内部可以直接访问私有属性,实例对象不能,即per.gender报错
        this.gender = gender 
    }
    
    //通过内部方法将私有属性向外部暴露
    getGender(){
        return this.gender
    }
    setGender(value){
        this.gender = value
    }
}

ts中通过get set 来简化以上代码

class Person{
    private name: string
    
    constructor(name:string){
        this.name = name
    }

    get name(){
        return this.name
    }
    set name( val: string ){
        this.name = val
    }
}

const per = new Person('蜘蛛精')

console.log( per.name )//per.name实际是调用了Person的get name方法
per.name = '猪八戒'  // 实际调用Person的 set name方法