TypeScript 入門指北(二)

上篇文章我們提到了爲什麼要學 TypeScript, 以及通過 TypeScriptJavaScript 的簡單對比,熟悉了 TypeScript 一些較爲基礎的語法。

學過面向對象的同學都知道,面向對象的三個基本要素就是:

  • 封裝
  • 繼承
  • 多態

TypeScript 中,這幾種語法都與之有密切的聯繫:

  • 函數
  • 接口
  • 泛型

當然,函數接口上篇文章已經講過了,這篇文章着重講一下

在面向對象編程(OOP)中,類是對對象的一個高度的抽象。打個比方,女朋友可以看成一個對象,因爲女朋友是具體的一個人;而女人/人則可以看成一個類,因爲它是泛指的。

根據這個關係,我們可以用 TypeScript 來定義一個 Woman 類並且 new 一個對象(女朋友)出來:

class Woman {}
let girlFriend = new Woman()

可以看到,這個對象什麼都沒有,接下來我們給她添加點屬性上去,讓她變得更立體一些。

屬性

屬性包含:

  • 私有屬性private): 屬性被聲明爲 private(私有)之後,不能在類之外的地方訪問。
  • 公有屬性public):如果不標記,則屬性默認被聲明爲 public(公有)。
  • 保護屬性protected):屬性被聲明爲 protected(保護)之後,不能再類之外的地方訪問,但是可以在派生類中訪問,也就是說在它的子類中可以訪問這個屬性。
  • 靜態屬性static):屬性被聲明爲 static(靜態),此時該屬性屬於而不屬於的實例或者子類,相應的需要在屬性前加上類名才能訪問。

我們簡單拓展下上面那段代碼,給 Woman 類添加幾個屬性:

  • 姓名
  • 身高
  • 年齡
  • ...
class Woman {
    public name: string;
    public height: number;
    private age: number;
}

在拓展這個類的時候我們發現,其實 Woman 類還能夠再抽象成 人類Person),而這就涉及到了繼承。

繼承

我們定義一個 Person 類,並讓 Woman 繼承 Person

// 父類
class Person {
    public height: number;
    protected name: string;
    public age: number;
    constructor (name: string, height: number, age: number) {
        this.name = name
        this.height = height
        this.age = age
    }
}
// 子類
class Woman extends Person {
    constructor(name: string, height: number, age: number) {
        super(name, height, age)
    }
}
let girlFriend = new Woman('girl', 180, 18)

抽象類和抽象方法

抽象類抽象方法 的定義方式都是在前邊加一個 abstract 關鍵字,不同的是,抽象類 可以包含具體的屬性和函數實現,但是 抽象函數 則必須在子類中實現。換言之,抽象類 可以擁有自己的獨立行爲,但是 抽象函數 則跟 接口interface)類似,不包括具體的實現。

因此,上面的例子我們可以再進行拓展,將 Person 定義成一個抽象類,再讓 Woman 繼承它

// 父類
abstract class Person {
    public height: number;
    protected name: string;
    public age: number;
    constructor (name: string, height: number, age: number) {
        this.name = name
        this.height = height
        this.age = age
    }
    abstract moYu (): void;
    walk (): void {
        console.log('walk')
    }
}
// 子類
class Woman extends Person {
    constructor(name: string, height: number, age: number) {
        super(name, height, age)
    }
    moYu () {
        console.log('今天你摸魚了嗎?')
    }
}
let girlFriend = new Woman('girl', 180, 18)


這裏 Person 的屬性是否定義,取決於 Person 中是否存在非抽象函數,否則沒有必要寫。

系列文章:

參考資料:

練習地址:https://www.tslang.cn/play/in...

掃描下方的二維碼或搜索「tony老師的前端補習班」關注我的微信公衆號,那麼就可以第一時間收到我的最新文章。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章