簡介

  • 直接定義的屬性是實例屬性,需要通過對象的實例去訪問
  • 使用static開頭的屬性是靜態(tài)屬性(類屬性)没炒,可以直接通過類去訪問
// 使用class關鍵字來定義一個類
/*
*   對象中主要包含了兩個部分:
*       屬性
*       方法
* */
class Person{

    /*
    *   直接定義的屬性是實例屬性,需要通過對象的實例去訪問:
    *       const per = new Person();
    *       per.name
    *
    *   使用static開頭的屬性是靜態(tài)屬性(類屬性)畜晰,可以直接通過類去訪問
    *       Person.age
    *
    *   readonly開頭的屬性表示一個只讀的屬性無法修改
    * */

    // 定義實例屬性
    // readonly name: string = '孫悟空';
    name = '孫悟空';

    // 在屬性前使用static關鍵字可以定義類屬性(靜態(tài)屬性)
    // static readonly age: number = 18;
    age = 18;

    // 定義方法
    /*
    * 如果方法以static開頭則方法就是類方法猾浦,可以直接通過類去調(diào)用
    * */
    sayHello(){
        console.log('Hello 大家好!');
    }
}

const per = new Person();
// console.log(per.name, per.age);
// console.log(Person.age);

構造函數(shù)

  • constructor 被稱為構造函數(shù)
  • 構造函數(shù)會在對象創(chuàng)建時調(diào)用 也就是new的過程
class Dog{
    name: string;
    age: number;
    // constructor 被稱為構造函數(shù)
    //  構造函數(shù)會在對象創(chuàng)建時調(diào)用 也就是new的過程
    constructor(name: string, age: number) {
        // 在實例方法中捞蚂,this就表示當前當前的實例
        // 在構造函數(shù)中當前對象就是當前新建的那個對象
        // 可以通過this向新建的對象中添加屬性
        this.name = name;
        this.age = age;
    }
    bark(){
        // 在方法中可以通過this來表示當前調(diào)用方法的對象
        console.log(this.name);
    }
}

const dog = new Dog('小黑', 4);
const dog2 = new Dog('小白', 2);
// console.log(dog);
// console.log(dog2);
dog2.bark();

繼承

  • 使用繼承后,子類將會擁有父類所有的方法和屬性
  • 通過繼承可以將多個類中共有的代碼寫在一個父類中跷究,這樣只需要寫一次即可讓所有的子類都同時擁有父類中的屬性和方法
  • 如果在子類中添加了和父類相同的方法姓迅,則子類方法會覆蓋掉父類的方法,這種子類覆蓋掉父類方法的形式,稱為方法重寫
 // 定義一個Animal類
    class Animal{
        name: string;
        age: number;
        constructor(name: string, age: number) {
            this.name = name;
            this.age = age;
        }
        sayHello(){
            console.log('動物在叫~');
        }
    }

    // 定義一個表示狗的類
    // 使Dog類繼承Animal類
    class Dog extends Animal{
        run(){
            console.log(`${this.name}在跑~~~`);
        }
        sayHello() {
            console.log('汪汪汪汪队贱!');
        }
    }
    // 定義一個表示貓的類
    // 使Cat類繼承Animal類
    class Cat extends Animal{
        sayHello() {
            console.log('喵喵喵喵色冀!');
        }
    }
    const dog = new Dog('旺財', 5);
    const cat = new Cat('咪咪', 3);
    console.log(dog);
    dog.sayHello();
    dog.run();
    console.log(cat);
    cat.sayHello();

super

  • 如果在子類中寫了構造函數(shù),在子類構造函數(shù)中必須對父類的構造函數(shù)進行調(diào)用柱嫌,也就是說只要子類中寫了constructor锋恬,那么必須要寫super
  • super()其實就是調(diào)用父類的構造函數(shù)
  • 在子類的方法中 super就表示當前類的父類
class Animal {
        name: string;
        constructor(name: string) {
            this.name = name;
        }
        sayHello() {
            console.log('動物在叫~');
        }
    }

    class Dog extends Animal{
        age: number;
        constructor(name: string, age: number) {
            // 如果在子類中寫了構造函數(shù),在子類構造函數(shù)中必須對父類的構造函數(shù)進行調(diào)用
            super(name); // 調(diào)用父類的構造函數(shù)
            this.age = age;
        }
        sayHello() {
            // 在子類的方法中 super就表示當前類的父類
            //super.sayHello();
            console.log('汪汪汪汪编丘!');
        }
    }
    const dog = new Dog('旺財', 3);
    dog.sayHello();

抽象類

  • 以abstract開頭的類是抽象類与学,抽象類和其他類區(qū)別不大,只是不能用來創(chuàng)建對象嘉抓,抽象類就是專門用來被繼承的類
  • 抽象類中可以添加抽象方法
  • 抽象方法使用 abstract開頭索守,沒有方法體,抽象方法只能定義在抽象類中抑片,子類必須對抽象方法進行重寫
 abstract class Animal {
        name: string;
        constructor(name: string) {
            this.name = name;
        }
        // 定義一個抽象方法
        // 抽象方法使用 abstract開頭卵佛,沒有方法體
        // 抽象方法只能定義在抽象類中,子類必須對抽象方法進行重寫
        abstract sayHello():void;
    }
    class Dog extends Animal{
        sayHello() {
            console.log('汪汪汪汪敞斋!');
        }
    }
    class Cat extends Animal{
        sayHello() {
            console.log('喵喵喵喵截汪!');
        }
    }
    const dog = new Dog('旺財');
    dog.sayHello();

TS可以在屬性前添加屬性的修飾符

  • public 修飾的屬性可以在任意位置訪問(修改) 默認值
  • private 私有屬性,私有屬性只能在類內(nèi)部進行訪問(修改)植捎,通過在類中添加方法使得私有屬性可以被外部訪問
  • protected 受包含的屬性衙解,只能在當前類和當前類的子類中訪問(修改)

getter VS setter

原本屬性可以任意的被修改,將會導致對象中的數(shù)據(jù)變得非常不安全焰枢。通過調(diào)用 set 函數(shù)進行修改蚓峦,并在 set 函數(shù)中對設置進行一些控制,可以放置屬性被任意修改 比如 將 age賦值為一個負數(shù)等
原先

 // 定義一個表示人的類
    class Person{
        // TS可以在屬性前添加屬性的修飾符
        private _name: string;
        private _age: number;

        constructor(name: string, age: number) {
            this._name = name;
            this._age = age;
        }

        /*
        *   getter方法用來讀取屬性
        *   setter方法用來設置屬性
        *       - 它們被稱為屬性的存取器
        * */

        // 定義方法济锄,用來獲取name屬性
        // getName(){
        //     return this._name;
        // }
        //
        // // 定義方法暑椰,用來設置name屬性
        // setName(value: string){
        //     this._name = value;
        // }
        //
        // getAge(){
        //     return this._age;
        // }
        //
        // setAge(value: number){
        //     // 判斷年齡是否合法
        //     if(value >= 0){
        //         this._age = value;
        //     }
        // }

TS中設置方式

        get name(){
            // console.log('get name()執(zhí)行了!荐绝!');
            return this._name;
        }

        set name(value){
            this._name = value;
        }

        get age(){
            return this._age;
        }

        set age(value){
            // 在方法中可以對變量進行一些設置
            if(value >= 0){
                this._age = value
            }
        }

protected

    class A{
        protected num: number;
        constructor(num: number) {
            this.num = num;
        }
    }

    class B extends A{
        test(){
            console.log(this.num);
        }
    }

    const b = new B(123);
    // b.num = 33; num 變量只能在類里面訪問 在外面訪問不到 

其他書寫形式

 
   /* class C{
        name: string;
        age: number

        // 可以直接將屬性定義在構造函數(shù)中
        constructor(name: string, age: number) {
            this.name = name;
             this.age = age;
        }
    }*/
    class C{

        // 可以直接將屬性定義在構造函數(shù)中
        constructor(public name: string, public age: number) {
        }

    }
    const c = new C('xxx', 111);
    console.log(c);
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末一汽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子很泊,更是在濱河造成了極大的恐慌,老刑警劉巖沾谓,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件委造,死亡現(xiàn)場離奇詭異,居然都是意外死亡均驶,警方通過查閱死者的電腦和手機昏兆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妇穴,“玉大人爬虱,你說我怎么就攤上這事隶债。” “怎么了跑筝?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵死讹,是天一觀的道長。 經(jīng)常有香客問我曲梗,道長赞警,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任虏两,我火速辦了婚禮愧旦,結果婚禮上,老公的妹妹穿的比我還像新娘定罢。我一直安慰自己笤虫,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布祖凫。 她就那樣靜靜地躺著琼蚯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝙场。 梳的紋絲不亂的頭發(fā)上凌停,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音售滤,去河邊找鬼罚拟。 笑死,一個胖子當著我的面吹牛完箩,可吹牛的內(nèi)容都是我干的赐俗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弊知,長吁一口氣:“原來是場噩夢啊……” “哼阻逮!你這毒婦竟也來了?” 一聲冷哼從身側響起秩彤,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叔扼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漫雷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓜富,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年降盹,在試婚紗的時候發(fā)現(xiàn)自己被綠了与柑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖价捧,靈堂內(nèi)的尸體忽然破棺而出丑念,到底是詐尸還是另有隱情,我是刑警寧澤结蟋,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布脯倚,位于F島的核電站,受9級特大地震影響椎眯,放射性物質(zhì)發(fā)生泄漏挠将。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一编整、第九天 我趴在偏房一處隱蔽的房頂上張望舔稀。 院中可真熱鬧,春花似錦掌测、人聲如沸内贮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夜郁。三九已至,卻和暖如春粘勒,著一層夾襖步出監(jiān)牢的瞬間竞端,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工庙睡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留事富,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓乘陪,卻偏偏與公主長得像统台,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啡邑,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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