上篇文章我們提到了爲什麼要學TypeScript
, 以及通過TypeScript
跟JavaScript
的簡單對比,熟悉了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老師的前端補習班」關注我的微信公衆號,那麼就可以第一時間收到我的最新文章。