TypeScript--3.類

在ES6之前,JS沒有class關(guān)鍵字,JS的面向?qū)ο蠛屠^承也是面試中常見的問題.之前接觸過PHP面向?qū)ο蟮脑?在看這部分內(nèi)容會(huì)覺得很多相近相似的內(nèi)容

1.類

類是描述一類相同事物特征和行為的抽象.描述一個(gè)類需要兩部分,屬性描述特征,方法描述行為,并且用class來(lái)修飾,這樣構(gòu)成了一個(gè)類,類相當(dāng)于提供了一個(gè)模板,快速的根據(jù)模板創(chuàng)建的對(duì)象.先看一個(gè)類的例子

class Person{    
    name:string;    
    constructor(name:string) {        
        this.name = name;    
    }    
    sayHi(){       
        return this.name;    
    }
}

name是屬性,constructor是構(gòu)造函數(shù),構(gòu)造函數(shù)在JS的面向?qū)ο罄镆泊嬖?初始化對(duì)象自定義內(nèi)容的函數(shù),sayHi是方法,方法里返回name屬性的內(nèi)容,整體寫法跟JS的面向?qū)ο箢愃?獲取值的時(shí)候也是使用this關(guān)鍵字.接下來(lái)看一下解析的.js文件里的內(nèi)容

var Person = (function () {    
    function Person(name) {        
        this.name = name;    
    }    
    Person.prototype.sayHi = function () {        
        return this.name;    
    };    
    return Person;
}());

使用的就是JS的構(gòu)造函數(shù),在原型上添加了一個(gè)sayHi方法,還是比較好理解的

2.繼承

TypeScript里的繼承跟PHP還是比較相似的,相當(dāng)于是子類對(duì)父類進(jìn)行功能和內(nèi)容的擴(kuò)張,使用的關(guān)鍵字也是extends,延展.

// 父類
class Person{    
    name:string;    
    constructor(name: string) { 
        this.name = name; 
    }    
    move(meter: number = 0) {        
        console.log(\`${this.name} moved ${meter}m.\`);    
    }
}
// 子類
class Student extends Person {    
    age:number;    
    constructor(name: string, age:number) {        
        super(name);        
        this.age = age;    
    }    
    move(meter = 5) {        
        console.log("測(cè)試...");        
        super.move(meter);    
    }
}

Student繼承父類Person,子類會(huì)繼承父類所有特征和行為,子類的構(gòu)造函數(shù)里,如果子類和父類同時(shí)聲明構(gòu)造函數(shù),子類創(chuàng)建對(duì)象的時(shí)候優(yōu)先使用自己類里的構(gòu)造函數(shù),如果還想使用父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)里使用super(),而且這句話要放在子類構(gòu)造函數(shù)的最上面,否則會(huì)報(bào)錯(cuò),只有構(gòu)造函數(shù)需要注意這個(gè)問題.
代碼里演示了子類重寫了繼承過來(lái)的move方法,如果還想調(diào)用父類功能,可以在方法里視同super.move(),通過super來(lái)調(diào)用父類的方法,保留功能.

3.修飾符

修飾符的作用就是用來(lái)限制屬性和方法使用的范圍,有三種修飾符,公有public,私有private,被保護(hù)的protected

1.public 公有的
方法和屬性默認(rèn)的修飾符就是public,對(duì)象在使用它修飾的屬性和方法時(shí),可以直接在用.的方式進(jìn)行調(diào)用,使用范圍是最大的

class Person{    
    public name:string;    
    constructor(name: string) { this.name = name; }    
    public move(meter: number = 0) {        
        console.log(\`${this.name} moved ${meter}m.\`);    
    }
}

2.被保護(hù)的 protected
被protected修飾的屬性和方法,限制了屬性和方法的使用范圍,只能在類和子類中使用,如果在類外部調(diào)用,會(huì)報(bào)錯(cuò)

class Person{    
    protected name:string;    
    constructor(name: string) { this.name = name; }    
    protected move(meter: number = 0) {}
}
class Student extends Person {    
    age:number;    
    constructor(name: string, age:number) {        
        super(name);        
        this.age = age;    
    }    
    move(meter = 5) {       
    super.move();       
    console.log(this.name); // 子類的內(nèi)部可以使用    
    }
}
let an = new Person("張三");
an.move(); // 報(bào)錯(cuò),在類的外部使用

類的內(nèi)部,就值在類對(duì)應(yīng)的大括號(hào)里,protected修飾的屬性方法可以使用,這樣限制了屬性和方法的使用范圍,使用受限,相對(duì)的安全性更好

3.私有的 private
private的使用范圍更小了,被限制到只能在自己類的內(nèi)容使用,連子類都不能使用,當(dāng)時(shí)private是使用最多的,因?yàn)樽畲蠡臏p少了使用范圍,能更好規(guī)避一些不必要的使用出現(xiàn)的問題,更安全

class Person{    
    private name:string;    
    constructor(name: string) { this.name = name; }    
    private move(meter: number = 0) {}
    }
    class Student extends Person {    
        age:number;    
        constructor(name: string, age:number) {        
            super(name);        
            this.age = age;    
      }    
      move(meter = 5) {       
          super.move(); // 報(bào)錯(cuò),子類的內(nèi)部也不能使用
          console.log(this.name); // 報(bào)錯(cuò),子類的內(nèi)部也不能使用    
    }
}

當(dāng)這樣的類創(chuàng)建的對(duì)象,想獲取屬性的值的時(shí)候,需要用setters和getters對(duì)屬性進(jìn)行操作

<pre>
class Person{
private _name:string;
constructor(name: string) { this.name = name; }
set name(newName:string){
this._name = newName;
}
get name(){
return this._name;
}
}
let per = new Person("張三");
per.name = "龍哥";
console.log(per.name);
</pre>

在使用設(shè)置器setters和訪問器getters時(shí),屬性名會(huì)習(xí)慣的加一個(gè)下劃線,用來(lái)和另個(gè)方法名進(jìn)行區(qū)分,這種方式和iOS里的屬性寫法一樣,對(duì)象可以直接使用,用法跟之前一樣,只不過本質(zhì)是用函數(shù)來(lái)賦值.在使用的時(shí)候需要注意,編譯器至少是ES5或者更高,否則會(huì)報(bào)錯(cuò)

4.靜態(tài)屬性

之前的屬性都是由對(duì)象來(lái)使用,必須實(shí)例化之后,才能使用.靜態(tài)屬性不同,這類屬性都用在類本身上.用static關(guān)鍵詞來(lái)修飾

<pre>
class Grid {
static origin = {x: 100, y: 10};
test():void{
console.log(Grid.origin.x);
}
}
let obj = new Grid();
obj.test();
console.log(Grid.origin.x);
console.log(obj.origin.x); // 報(bào)錯(cuò),對(duì)象不能使用靜態(tài)屬性
</pre>

5.抽象類

抽象類一般作為其他派生類的基類使用,如果通過這個(gè)類進(jìn)行對(duì)象創(chuàng)建,在控制臺(tái)會(huì)報(bào)錯(cuò),內(nèi)容就是在對(duì)一個(gè)抽象類進(jìn)行實(shí)例化操作.抽象類用關(guān)鍵詞abstract進(jìn)行修飾,抽象類里的正常方法具體的實(shí)現(xiàn),用abstract修飾的抽象方法需要在子類中實(shí)現(xiàn).抽象類跟接口類似,都是定義方法簽名,不包含方法體.

<pre>
abstract class Person {
constructor(public name: string) {}
printName(): void {
console.log('name: ' + this.name);
}
abstract printMeeting(): void; // 必須在派生類中實(shí)現(xiàn)
}
class Animal extends Person {
constructor(name:string) {
super(name);
}
printMeeting(): void {
console.log('嗯嗯');
}
generateReports(): void {
console.log('餓了');
}
}
let an = new Animal("龍哥");
an.printMeeting();
console.log(an.name);
</pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市趋急,隨后出現(xiàn)的幾起案子腔长,更是在濱河造成了極大的恐慌幕随,老刑警劉巖埃碱,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異毅人,居然都是意外死亡铣耘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門囤锉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坦弟,“玉大人,你說(shuō)我怎么就攤上這事官地∧鸢” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵驱入,是天一觀的道長(zhǎng)赤炒。 經(jīng)常有香客問我,道長(zhǎng)亏较,這世上最難降的妖魔是什么莺褒? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮雪情,結(jié)果婚禮上遵岩,老公的妹妹穿的比我還像新娘。我一直安慰自己巡通,他們只是感情好旷余,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扁达,像睡著了一般正卧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跪解,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天炉旷,我揣著相機(jī)與錄音,去河邊找鬼叉讥。 笑死窘行,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的图仓。 我是一名探鬼主播罐盔,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼救崔!你這毒婦竟也來(lái)了惶看?” 一聲冷哼從身側(cè)響起捏顺,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纬黎,沒想到半個(gè)月后幅骄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡本今,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年拆座,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冠息。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挪凑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逛艰,到底是詐尸還是另有隱情躏碳,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布瓮孙,位于F島的核電站,受9級(jí)特大地震影響选脊,放射性物質(zhì)發(fā)生泄漏杭抠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一恳啥、第九天 我趴在偏房一處隱蔽的房頂上張望偏灿。 院中可真熱鬧,春花似錦钝的、人聲如沸翁垂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沿猜。三九已至,卻和暖如春碗脊,著一層夾襖步出監(jiān)牢的瞬間啼肩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工衙伶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祈坠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓矢劲,卻偏偏與公主長(zhǎng)得像赦拘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芬沉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法躺同,類相關(guān)的語(yǔ)法阁猜,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法笋籽,異常的語(yǔ)法蹦漠,線程的語(yǔ)...
    子非魚_t_閱讀 31,623評(píng)論 18 399
  • 一:java概述:1,JDK:Java Development Kit车海,java的開發(fā)和運(yùn)行環(huán)境笛园,java的開發(fā)工...
    ZaneInTheSun閱讀 2,649評(píng)論 0 11
  • 寫代碼: 1,明確需求侍芝。我要做什么研铆? 2,分析思路州叠。我要怎么做棵红?1,2,3。 3咧栗,確定步驟逆甜。每一個(gè)思路部分用到哪些...
    雨塵1閱讀 295評(píng)論 0 1
  • 紀(jì)實(shí)生活 體悟人生 現(xiàn)在是碗豆的季節(jié) 所以 它就成了大多數(shù)人選擇的對(duì)象 我也是經(jīng)常 拿它來(lái)做各式各樣的素菜 現(xiàn)在做...
    木風(fēng)恒閱讀 288評(píng)論 0 1
  • 寒館零客孤影倚交煞, 浮云遮月霜點(diǎn)衣。 征鴻過處寫春憶斟或, 千里縱橫雀聲遺素征。
    傘旦丹閱讀 468評(píng)論 0 2