美文网首页
TypeScript学习7、类Class

TypeScript学习7、类Class

作者: 喜欢骑着蜗牛散步 | 来源:发表于2019-11-19 16:44 被阅读0次

TS类

class Point {
    public x: number
    public y: number
    constructor(x: number, y: number) {
        this.x = x
        this.y = y
    }
    public getPosition() {
        return `(${this.x}, ${this.y})`
    }
}
const point1 = new Point(1, 2)
console.log(point1.getPosition()) // (1, 2)

TS类 修饰符
public 公共修饰符,修饰 可以通过实例访问的属性和方法。

class Parent {
     public name: string
     constructor(name: string) {
         this.name = name
     }
 }
 class Child extends Parent {
     constructor(name: string) {
         super(name)
     }
 }
 const child = new Child('bob')
 console.log(child.name) // bob

private 私有修饰符,修饰 类的外部无法访问的属性和方法,只能在类的定义中使用。

class Parent {
    private age: number
    constructor(age: number) {
        this.age = age
    }
}

const p = new Parent(50)
console.log(p.age) // 报错:属性“age”为私有属性,只能在类“Parent”中访问
class Child extends Parent {
    constructor( age: number) {
        super(age)
        console.log(super.age) // 报错:通过 "super" 关键字只能访问基类的公共方法和受保护方法。
    }
}

protected 受保护修饰符, protected和private相似,但protected成员可以在派生类中访问(能被继承,但不能在实例中访问,另外若constructor是protected,则不能被实例化,只能被继承)。

class Parent {
    protected age: number
    constructor(age: number) {
        this.age = age
    }
    protected getAge() {
        return this.age
    }
}

const p = new Parent(5)
console.log(p.age) // 属性“age”受保护,只能在类“Parent”及其子类中访问。
class Child extends Parent {
    constructor( age: number) {
        super(age)
        console.log(super.age) // 报错:通过 "super" 关键字只能访问基类的公共方法和受保护方法。
        console.log(this.age) // 20
        console.log(this.getAge()) // 20
    }
}
const child = new Child(20)
console.log(child.age) // 报错: 属性“age”受保护,只能在类“Parent”及其子类中访问。
console.log(child.getAge())// 报错: 属性“getAge”受保护,只能在类“Parent”及其子类中访问。
// 在派生类通过super访问, 只能访问基类的公共方法和受保护方法。

readonly 修饰符, 设置为readonly属性, 实例只能读取,不能修改。

class UserInfo {
    public readonly name: string
    constructor(name: string) {
        this.name = name
    }
}
const u = new UserInfo('bob')
console.log(u.name) // bob
u.name = 'tina' // 报错: 无法分配给“name”,因为它是只读属性。

参数属性, 参数属性可以方便地让我们在一个地方定义并初始化一个成员。
在参数前面加上访问修饰符,既指定了属性的类型,又将属性放到实例上。

class A {
    constructor(public name: string) {

    }
}

const a = new A('toni')
console.log(a.name) // toni

static 静态属性,指定属性存在于类本身上面而不是类的实例上。

class Grid  {
    public static count: number = 20
    public static getGridCount() {
        return Grid.count
    }
    constructor() {}
}
console.log(Grid.getGridCount()) // 20

存取器 get set

class Info {
    public title: string
    public content?: string // ? 可选属性
    private _infoStr: string
    constructor(title: string,  public time?: string, content?: string) {
        this.title = title
        this.content = content
    }
    get infoStr() {
        return this._infoStr
    }
    set infoStr(val) {
        this._infoStr = val
    }
}
const i = new Info('标题', '2019-11-20', '正文')
i.infoStr = '12'
console.log(i.infoStr)// 12

abstract 抽象类,抽象类做为其它派生类的基类使用。不能直接实例化。 不同于接口,抽象类可以包含成员的实现细节。 abstract关键字是用于定义抽象类和在抽象类内部定义抽象方法。

抽象类中的抽象方法不包含具体实现并且必须在派生类中实现。 抽象方法的语法与接口方法相似。 两者都是定义方法签名但不包含方法体。 然而,抽象方法必须包含 abstract关键字并且可以包含访问修饰符。

abstract class Animal {
    constructor(public foot: string) {

    }
    public abstract eat(): string
}

class Dog extends Animal {
    constructor(public foot: string) {
        super(foot)
        this.foot = foot
    }
    public eat() {
        return '狗吃屎'
    }
}

class Cat extends Animal {
    constructor(public foot: string) {
        super(foot)
        this.foot = foot
    }
    public eat() {
        return '猫吃鱼'
    }
}
const dog1 = new Dog('屎')
const cat1 = new Cat('鱼')
console.log(dog1.eat()) // 狗吃屎
console.log(cat1.eat()) // 猫吃鱼

相关文章

网友评论

      本文标题:TypeScript学习7、类Class

      本文链接:https://www.haomeiwen.com/subject/xucgictx.html