TS學(xué)習(xí)筆記(三):類

傳統(tǒng)的 JavaScript 程序使用函數(shù)和基于原型的繼承來(lái)創(chuàng)建可重用的組件,從 ES6 開(kāi)始庸推,JavaScript 程序能夠使用基于類的面向?qū)ο蟮姆绞叫粘唷J褂?TypeScript另萤,你可以使用 ES6 中規(guī)定的新特性浑槽,編譯后的 JavaScript 可以在所有主流瀏覽器和平臺(tái)上運(yùn)行。

基本用法

class Person {
  public love: string;
  constructor(love: string) {
    this.love = love;
  }
  public sayLove() {
    console.log(`my love is ${this.love}`)
  }
}

繼承

在構(gòu)造器里訪問(wèn) this 的屬性之前领舰,一定要調(diào)用 super() 夫嗓,這個(gè)是 TypeScript 強(qiáng)制執(zhí)行的一條重要規(guī)則。

class Person {
  public love: string;
  constructor(love: string) {
    this.love = love;
  }
  public sayLove() {
    console.log(`my love is ${this.love}`)
  }
}

class SuperPerson extends Person {
  public name: string;
  constructor(love: string, name: string) {
    super(love);
    this.name = name;
  }
  public sayName(){
    console.log(`my name is ${this.name}`)
  }
}

let me = new SuperPerson('HTML', 'funlee');
me.sayLove()
me.sayName()

訪問(wèn)控制

public冲秽、private舍咖、protected

默認(rèn)是 public, 不再贅述锉桑,參考前面例子排霉。

當(dāng)成員標(biāo)記為 private 時(shí),它就不能在聲明它的類的外部訪問(wèn)民轴,用 protected 修飾的屬性依然如此攻柠。

class Person {
  private love: string; // or  prot
  constructor(love: string) {
    this.love = love;
  }
  public sayLove() {
    console.log(`my love is ${this.love}`)
  }
}

let me = new Person('TS');
me.love = 'JS'; // error

private 和 protected 有一點(diǎn)不同, protected 成員在派生類中仍然可以訪問(wèn)后裸。例如:

class Person {
  protected name: string; 
  constructor(name: string) {
    this.name = name;
  }
}
class Man extends Person {
  private love: string;
  constructor(name: string, love: string) {
    super(name);
    this.love = love;
  }
  public say() {
    // 如果Person 中用 private 修飾 name 則不能訪問(wèn)到 name 屬性
    console.log(`my name is ${this.name}, and my love is ${this.love}`);
  }
}
let me = new Man('funlee', 'TS');

注意:TypeScript 使用的是結(jié)構(gòu)性類型系統(tǒng)瑰钮,所以當(dāng)比較兩種不同的類型時(shí),如果所有的成員的類型都是兼容的微驶,那么這兩個(gè)類型就是兼容的浪谴。如:

class A {
  prop1: string
}
class B {
  prop1: string
  prop2: string
}
let instance:A = new B() // 允許這么做,因?yàn)锳的所有成員類型因苹,B中都有

但是如果被比較的類里面含有 private 和 protected 類型成員的時(shí)候苟耻,情況就不同了,這時(shí)候需要另一個(gè)類里也含有相應(yīng)的 private 或 protected 成員扶檐,類型才能是兼容的凶杖,所以有:

class A {
  private prop1: string
}
class B {
  private prop2: string
}
let p1:A = new B() // 報(bào)錯(cuò)
class C extends A {

}
let p2:A = new C() // 允許這么做

readonly

可以使用 readonly 關(guān)鍵字將屬性設(shè)置為只讀的,只讀屬性必須在聲明時(shí)或構(gòu)造函數(shù)里被初始化蘸秘。

class Person {
  readonly name: string;
  constructor(name: string) {
    this.name = name;
  }
}
let me = new Person('funlee');
me.name = 'new name'; // error

參數(shù)屬性

參數(shù)屬性允許同時(shí)創(chuàng)建初始化成員官卡,可以把聲明和賦值合并至一處蝗茁,如:

class Person {
  constructor(public name: string, protected love: string, readonly age: number, private weight: string) {
    this.name = name;
    this.love = love;
    this.age = age;
  }
  public sayWeight() {
    console.log(`my weight is ${this.weight}`)
  }
}
let me = new Person('funlee', 'TS', 18, '55kg');
me.sayWeight()

存取器

TypeScript 支持 getter 和 setter醋虏,但是有一點(diǎn)限制:編譯器輸出必須設(shè)為 ES5 或者更高寻咒,不支持降級(jí)到 ES3,另外颈嚼,當(dāng)一個(gè)存取器只帶有 get 卻不帶有 set 時(shí)毛秘,它會(huì)被自動(dòng)推斷為 readonly。

class Person {
  public _love: string;
  constructor(love: string) {
    this._love = love;
  }
  get love(): string{
    return this._love;
  }
  set love(newLove: string) {
    this._love = `error!! my love can't be chenged`;
  }
}
let me = new Person('TS');
console.log(me.love); // TS
me.love = 'HTML';
console.log(me.love); // error!! my love can't be chenged

靜態(tài)屬性

可以使用static來(lái)定義類里的靜態(tài)屬性阻课,靜態(tài)屬性屬于類自身叫挟,而不屬于實(shí)例,訪問(wèn)的時(shí)候要用類名訪問(wèn)限煞,而不能用實(shí)例對(duì)象訪問(wèn)抹恳,如:

class Person {
  static love: string = 'TS';
}
let me = new Person();
console.log(Person.love); // TS
console.log(me.love); // error

抽象類

抽象類只能作為其他派生類的基類使用,抽象類不能被實(shí)例化署驻,它具有如下特點(diǎn):

  • 抽象類可以包含成員的實(shí)現(xiàn)細(xì)節(jié)奋献,且抽象類必須用 abstract 聲明
  • 抽象類里不含方法體的方法稱為抽象方法,使用 abstract 聲明旺上,抽象方法必須被子類實(shí)現(xiàn)(抽象方法必須使用 abstract 關(guān)鍵字聲明瓶蚂,且可以包含訪問(wèn)修飾符)
abstract class Person {
  public love: string;
  constructor(love: string) {
    this.love = love;
  }
  abstract sayLove(): string; // 必須在派生類中實(shí)現(xiàn)
}
class Man extends Person{
  constructor(love: string){
    super(love)
  }
  sayLove() {
    return `my love is ${this.love}`;
  }
}
let me = new Man('TS');
console.log(me.sayLove()); // my love is TS

把類當(dāng)做接口使用

類定義會(huì)創(chuàng)建兩個(gè)東西:類的實(shí)例類型和一個(gè)構(gòu)造函數(shù),因?yàn)轭惪梢詣?chuàng)建出類型宣吱,所以能夠在允許使用接口的地方使用類窃这。

class Person {
  name: string;
  age: number;
}
interface Man extends Person {
  love: string;
}
let me: Man = {
  name: 'funlee',
  age: 18,
  love: 'TS'
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市征候,隨后出現(xiàn)的幾起案子杭攻,更是在濱河造成了極大的恐慌,老刑警劉巖疤坝,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兆解,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡卒煞,警方通過(guò)查閱死者的電腦和手機(jī)痪宰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)畔裕,“玉大人衣撬,你說(shuō)我怎么就攤上這事“缛模” “怎么了具练?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)甜无。 經(jīng)常有香客問(wèn)我扛点,道長(zhǎng)哥遮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任陵究,我火速辦了婚禮眠饮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铜邮。我一直安慰自己仪召,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布松蒜。 她就那樣靜靜地躺著扔茅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秸苗。 梳的紋絲不亂的頭發(fā)上召娜,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音惊楼,去河邊找鬼玖瘸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胁后,可吹牛的內(nèi)容都是我干的店读。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼攀芯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屯断!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起侣诺,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤殖演,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后年鸳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體趴久,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年搔确,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彼棍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膳算,死狀恐怖座硕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涕蜂,我是刑警寧澤华匾,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站机隙,受9級(jí)特大地震影響蜘拉,放射性物質(zhì)發(fā)生泄漏萨西。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一旭旭、第九天 我趴在偏房一處隱蔽的房頂上張望谎脯。 院中可真熱鬧,春花似錦您机、人聲如沸穿肄。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至矢否,卻和暖如春仲闽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背僵朗。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工赖欣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人验庙。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓顶吮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親粪薛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悴了,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容