Tyspscript中的class

申明一個(gè)類 class

class 類名 {
    // class中主要包含兩個(gè)部分踱承,屬性和方法
    屬性
    方法
}

實(shí)例屬性和類屬性

  • 實(shí)例屬性:實(shí)例化之后锻梳,也就是new之后才能用的屬性和方法
  • 類屬性(靜態(tài)屬性):class本身自己直接使用的,下面是TS中的屬性修飾符
    • static:靜態(tài)屬性,屬于類自身不屬于實(shí)例,只有自身可以訪問到
    • readonly:只讀屬性九妈,只允許讀取,不允許修改
    • public:所有屬性的默認(rèn)屬性雾鬼。隨意讀寫
    • private:申明是一個(gè)私有屬性允蚣,不允許在外部訪問
    • protected:和private基本一樣,也是不允許在外部訪問呆贿,但是允許在子 類中訪問
  • demo
    class Person {
        // 定義實(shí)例屬性
        name:string = '景天';
        // 在屬性前使用static關(guān)鍵字可以定義類屬性
        static age:number = 18;
        
        // 定義實(shí)例方法
        sayHello() {
            console.log('Hello')
        }
        
        // 定義類方法
        static sayHi() {
            console.log('Hi')
        }
    }
    
    // 實(shí)例屬性和方法的使用
    class p = new Person()
    console.log(p.name)
    p.sayHello()
    
    // 類屬性和方法的使用
    console.log(Person.age)
    Person.sayHi()
    

class中的構(gòu)造函數(shù)(constructor)

  • 常規(guī)寫法
    class Person {
        name: string
        age: number
        
        // constructor 被稱為構(gòu)造函數(shù)
        // 構(gòu)造函數(shù)會(huì)在實(shí)例對(duì)象創(chuàng)建的時(shí)候調(diào)用
        constructor(name:string,age:number) {
            // 在實(shí)例方法中,this就是表示當(dāng)前的實(shí)例
            // 在構(gòu)造函數(shù)中森渐,當(dāng)前對(duì)象就是當(dāng)前新建的那個(gè)對(duì)象
            // 可以通過this向新建的對(duì)象中添加屬性
            this.name = name
            this.age = age
        }
        
        sayHi() {
            // 在實(shí)例方法中做入,可以通過this來表示當(dāng)前調(diào)用方法的對(duì)象
            console.log(this)
            console.log(`你好,我是${this.name}`)
        }
    }
    
    class p = new Person('景天'同衣,18)
    console.log(p.name,p.age)
    
  • 簡寫方式
    class Person {
        // 可以把屬性的定義寫到構(gòu)造函數(shù)的參數(shù)中去竟块,所示一種語法糖的寫法
        constructor(public name:string, public age:number) {
        }
        
        sayHi() {
            console.log(`你好,我是${this.name}`)
        }
    }
    
    class p = new Person('景天'耐齐,18)
    console.log(p.name,p.age)
    

class中的繼承

  • 使用繼承后浪秘,子類將會(huì)擁有父類所有的方法和屬性蒋情。
  • 如果子類中和父類中有相同的屬性和方法,子類中會(huì)覆蓋父類的方法耸携。
  • 使用:子類 extends 父類
  • demo
    // 創(chuàng)建一個(gè)父類
    class Animal {
        name: string
        
        constructor(name:string) {
            this.name = name
        }
        
        sayHi() {
            console.log('動(dòng)物們說Hi')
        }
    }
    
    // 狗這個(gè)子類繼承父類
    class Dog extends Animal {
        age: number
        
        constructor(name:string,age:number) {
            // 如果在子類中寫了構(gòu)造函數(shù)棵癣,在子類的構(gòu)造函數(shù)中必須要調(diào)用下父類的構(gòu)造函數(shù)
            // super就是代表父類中的構(gòu)造函數(shù)
            super(name);
            this.age = age
        }
    
        // 添加一個(gè)自己的方法
        run() {
            console.log('我在跑呢')
        }
    }
    
    // 貓這個(gè)子類繼承父類
    class Cat extends Animal {
        // 子類中也有sayHi方法,會(huì)覆蓋父類中的方法嘁酿,使用自己的方法
        sayHi() {
            console.log('喵喵喵喵')
        }
    }
    
    let dog = new Dog('哮天犬',1000)
    dog.sayHi()
    dog.run()
    let cat = new Cat('九命貓妖')
    cat.sayHi()
    

抽象類和抽象方法

  • 抽象類:用abstract開頭留晚,這代表是一個(gè)抽象類乾翔,抽象類和其他類的區(qū)別不大,只是不能用來創(chuàng)建對(duì)象河劝。
  • 抽象方法:同樣abstract開頭,抽象方法只能定義在抽象類中矛紫,并且子類中必須對(duì)抽象方法進(jìn)行重寫赎瞎。
  • demo
    // 創(chuàng)建一個(gè)父類
    /* 
        我們之前創(chuàng)建的父類,除了可以被繼承颊咬,自己也可以實(shí)例化务甥,但是有時(shí)候我們就想申明一個(gè)父類,不允許實(shí)例化贪染。
        那么可以用abstract開頭缓呛,這代表是一個(gè)抽象類,抽象類和其他類的區(qū)別不大杭隙,只是不能用來創(chuàng)建對(duì)象哟绊。
        可以說抽象類就是用來創(chuàng)建父類給子類繼承的。
        抽象類中可以添加抽象方法痰憎。
    */
    abstract class Animal {
        name: string
        
        constructor(name:string) {
            this.name = name
        }
        
        // 定義一個(gè)抽象方法票髓,同樣abstract開頭,沒有方法體铣耘。
        // 抽象方法只能定義在抽象類中洽沟,并且子類中必須對(duì)抽象方法進(jìn)行重寫。
        // void:空值
        abstract sayHi():void
    }
    
    class Dog extends Animal {
        sayHi() {
            console.log("汪汪汪")
        }
    }
    
    let a = new Animal() // 這樣就會(huì)報(bào)錯(cuò)蜗细,因?yàn)椴辉试S實(shí)例化
    

接口

  • 和抽象類相比
    • 抽象類的屬性值可以是有值得也可以是沒值裆操,接口的屬性值都是沒值的,只定義結(jié)構(gòu)炉媒,不考慮實(shí)際值
    • 接口中所有的方法都是抽象方法踪区。
    • 使用抽象類,是用extends繼承吊骤,可以繼承父類的方法缎岗,也可以重寫。接口是使用implements白粉,而且必須滿足接口中所有要求
  • demo
    // 定義一個(gè)接口
    interface myInter {
        name: string
        
        sayHello():void
    }
    
    // 定義一個(gè)類去實(shí)現(xiàn)上面的接口传泊,必須滿足接口的所有要求
    class Myclass implements myInter {
        name:string
        
        constructor(name:string) {
            this,name = name
        }
        
        sayHello() {
            console.log('Hello')
        }
    }
    
    // 接口如何擴(kuò)展呢鼠渺?可以使用extends擴(kuò)展,但是原來的不會(huì)改變
    interface myInter2 extends myInter {
        age: number
    }
    
    // 需要注意的一點(diǎn)是眷细,接口是允許重復(fù)的拦盹,并不會(huì)覆蓋,而是會(huì)合并
    // 下面這樣的薪鹦,obj就會(huì)有兩個(gè)屬性name和age
    interface obj {
        name: string
    }
    interface obj {
        age: number
    }
    

屬性的封裝

  • 應(yīng)用場(chǎng)景:有時(shí)候我們不想屬性簡單的暴露出去掌敬,也不想被隨意更改
  • 簡單的封裝
    class Person {
        /* 
            TS可以在屬性前面添加修飾符
                - static:靜態(tài)屬性,屬于類自身不屬于實(shí)例池磁,只有自身可以訪問到
                - readonly:只讀屬性奔害,只允許讀取,不允許修改
                - public:所有屬性的默認(rèn)屬性地熄。隨意讀寫
                - private:申明是一個(gè)私有屬性华临,不允許在外部訪問
                - protected:和private基本一樣,也是不允許在外部訪問端考,但是允許在子類中訪問
        */
        
        // 私有化兩個(gè)屬性
        private _name:string
        private _age: number
        
        constructor(name:string,age:number) {
            this._name = name;
            this._age = age;
        }
        
        // 提供給外界訪問和修改私有屬性的方法
        getName() {
            return this._name
        }
        setName(value:string) {
            this._name = value
        }
        getAge() {
            return this._name
        }
        setAge(value:number) {
            if(value > 0) {
                this._age = value
            }
        }
    }
    
    let p = new Person('景天'雅潭,18)
    
    console.log(p.getName());
    p.setName('雪見')
    console.log(p.getAge());
    p.setAge(17)
    
  • 存取器,比上面簡單的封裝好的多却特,這才是常用的方式
    // 使用屬性存取器
    class Person {
        // 私有化兩個(gè)屬性
        private _name:string
        paivate _age: number
        
        constructor(name:string,age:number) {
            this._name = name;
            this._age = age;
        }
        
        // 提供給外界訪問和修改私有屬性的方法
        get name() {
            return this._name
        }
        set name(value:string) {
            this._name = value
        }
        get age() {
            return this._name
        }
        set age(value:number) {
            if(value > 0) {
                this._age = value
            }
        }
    }
    
    let p = new Person('景天'扶供,18)
    
    console.log(p.name);
    p.name = '雪見'
    console.log(p.age);
    p.age = 17
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市裂明,隨后出現(xiàn)的幾起案子椿浓,更是在濱河造成了極大的恐慌,老刑警劉巖闽晦,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扳碍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仙蛉,警方通過查閱死者的電腦和手機(jī)笋敞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠瘪,“玉大人夯巷,你說我怎么就攤上這事“梗” “怎么了鞭莽?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長麸祷。 經(jīng)常有香客問我,道長褒搔,這世上最難降的妖魔是什么阶牍? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任喷面,我火速辦了婚禮,結(jié)果婚禮上走孽,老公的妹妹穿的比我還像新娘惧辈。我一直安慰自己,他們只是感情好磕瓷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布盒齿。 她就那樣靜靜地躺著,像睡著了一般困食。 火紅的嫁衣襯著肌膚如雪边翁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天硕盹,我揣著相機(jī)與錄音符匾,去河邊找鬼。 笑死瘩例,一個(gè)胖子當(dāng)著我的面吹牛啊胶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垛贤,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼焰坪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了聘惦?” 一聲冷哼從身側(cè)響起某饰,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎部凑,沒想到半個(gè)月后露乏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涂邀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年瘟仿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比勉。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劳较,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浩聋,到底是詐尸還是另有隱情观蜗,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布衣洁,位于F島的核電站墓捻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坊夫。R本人自食惡果不足惜砖第,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一撤卢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梧兼,春花似錦放吩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至考赛,卻和暖如春惕澎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欲虚。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來泰國打工集灌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人复哆。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓欣喧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梯找。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唆阿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

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