【TS】类的定义、继承、访问类型、constractor、getter、setter

类的定义与实例化

// index.ts     ts-node index.ts
// 定义类
class Person {
    name = 'lily';
    getName () {
        return this.name
    }
}
// 创建类的实例
const person = new Person()
console.log(person.getName()) //lily

类的继承

class Teacher extends Person {
    getTeacherName () {
        return 'Juny'
    },
    getTeacher (){
        // return super.getName() + 'Wang' // lily Wang
        return 'John' 
    }
}

const teacher = new Teacher()
// console.log(teacher.getName()) // 'lily'
console.log(teacher.getTeacherName()) // 'Junny'
console.log(teacher.getName()) // 'John' 子类覆盖父类方法

类的访问类型

  1. private        允许在类内被使用,一般用在需要被保护属性的场景下
  2. protected    允许在类内及继承的子类内使用
  3. public         默认为public 允许在类的内外被调用
class Person {
    protedcted name: string;
    private age: number;
    public sayHi() {
        return 'Hi'
    };
}

class Teacher extends Person {
    public sayBy() {
        this.age // 不可用
        this.name // 可用
    }
}

const person = new Person()
person.age = 18 // 不允许在类外被调用

constructor 构造器

constructor 函数在类被实例化的一瞬间自动被执行。

class Person {
    // 传统写法
    public name: string;
    constractor(name: string){ // 在类被实例化时自动执行
        this.name = name;
    }
    // 简化写法
    constructor(public name: string) {}
}
const person = new Person('Lily')

如父类有constructor,子类也有constructor,则需要在子类的constructor 内部用 super 调用父类构造器。

class Person {
    constractor (public name: string) {}
}
class Teacher extends Person {
    constractor (public age: number) {
        // super() 如果没有参数传递则调用空的super
        super('Lily')
          
    }
}

const teacher = new Teacher(18)

Getter Setter

当无法直接调用私有属性时,可以通过添加getter为实例提供访问进而间接访问类的私有属性,注意getter的调用与方法不同,不需要().

class Person {
    constractor (private _name: string) {}
    get name () {
        return this._name + ' Wang'
    }
    set name (name: string) {
        return this._name = name
    }
}

const person = new Person('Lily')
person.name
person.name = 'Lily Wang'

单例模式Demo

// 该类只能生成一个实例
class Demo {
    private static instance: Demo;
    private constructor (public name: string) {
        
    }
    // static 把该方法直接挂载在类而非类的实例上
    static getInstance () {
        if(!this.instance) {
            this.instance = new Demo('Lily')
        }
        return this.instance
    }
}

const demo = Demo.getInstance()

readonly 修饰器,限定属性只可读不可写 

class Person {
    public readonly name: string;
    constractor (name : string) {
        this.name = name
    }
}

const person = new Person ('Lily')
console.log(person.name) // Lily

抽象类

把可以共用的属性或方法抽离出来,生成一个抽象类,该抽象类可包含抽象方法或具体的方法和属性。抽象类只能被继承,不能被实例化。如抽象类内有抽象方法,继承的子类里必须有该抽象方法的具体实现。

abstract class Geom {
    width: number;
    radio: number;
    getType () {
        return 'Geom'
    }
    // 抽象方法,无具体实现
    abstract getArea(): number
}

class Circle extends Geom {
    getArea () {
        return 1
    }
}
class Square extends Geom {
    getArea () {
        return 2
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值