4.ts中的類

1. 類的定義

class Pointer {
    x: number 
    y: number  // 聲明的變量會被增加到實(shí)例上
    // 此函數(shù)中依然可以使用 剩余運(yùn)算符 可選參數(shù)  默認(rèn)參數(shù)
    // 傳入的實(shí)例直接就放在實(shí)例上,無需再次聲明  
    constructor(x: number, y?: number, ...args: number[]){ // 在constructor中的操作都是初始化操作
        this.x = x;
        this.y = y as number;
    }
}
let p = new Pointer(100,200)
console.log(p.x, p.y)

2. 類中的修飾符

    1. public 公開的候醒,都可以訪問到
class Animal {
    public name!: string  // 不寫默認(rèn)也是 public
    public age!: number
    constructor(name: string, age: number){
        this.name = name
        this.age = age
    }
}

class Dog extends Animal {
    constructor(name: string, age: number){
        super(name, age)
        console.log(this.name, this.age)  // 子類訪問
    }
}

let p = new Dog('Jack', 6)
console.log(p.name, p.age) // 外部訪問
    1. protected 受保護(hù)的膨疏,只能自己和子類訪問
class Animal {
    constructor(protected name: string, protected age: number){  // 簡化寫法
        this.name = name
        this.age = age
        console.log(this.name, this.age)  // 自己可以訪問
    }
}

class Dog extends Animal {
    constructor(name: string, age: number){
        super(name, age)
        console.log(this.name, this.age)  // 子類可以訪問
    }
}

let p = new Dog('Jack', 6)
// console.log(p.name, p.age) // 外部無法訪問
    1. private 私有的讼油,只有自己可以訪問
class Animal {
    constructor(private name: string, private age: number){
        this.name = name
        this.age = age
        console.log(this.name, this.age)  // 自己可以訪問
    }
}

class Dog extends Animal {
    constructor(name: string, age: number){
        super(name, age)
        // console.log(this.name, this.age)  // 子類無法訪問
    }
}

let p = new Dog('Jack', 6)
// console.log(p.name, p.age) // 外部無法訪問
    1. readonly 只能讀取
class Animal {
    constructor(readonly name: string,public age: number){
        this.name = name
        this.age = age
    }
    changeName(name: string){
        this.name = name; // 無法修改,僅讀屬性只能在constructor中被賦值
    }
}

class Dog extends Animal {
    constructor(name: string, age: number){
        super(name, age)
    }
}

let p = new Dog('Jack', 6)
p.changeName('Tom')

3. 靜態(tài)屬性和方法

class Animal {
    static type = '哺乳動物'; // 靜態(tài)屬性
    static getName() { // 靜態(tài)方法
        return '動物類';
    }
    private _name: string = 'Tom';

    get name() { // 屬性訪問器
        return this._name;
    }
    set name(name: string) {
        this._name = name;
    }
}
let a = new Animal();
console.log(a.name);

4. super 屬性

class Animal {
    say(message:string){
        console.log(message);
    } 
    static getType(){
        return '動物'
    }
}
class Cat extends Animal {
    say(){ // 原型方法中的super指代的是父類的原型
        super.say('貓貓叫');
    }
    static getType(){ // 靜態(tài)方法中的super指代的是父類
        return super.getType()
    }
}
let cat = new Cat();
console.log(Cat.getType())

5. 類的裝飾器

    1. 裝飾類

裝飾器作用就是擴(kuò)展類又活,擴(kuò)展類中的屬性和方法 , 但不能修飾函數(shù),函數(shù)會有變量提升的問題

function addSay1(val: string) {  // 洋蔥模型
    console.log(val)
    return function (target: any) {
        console.log(1)
    }
}
function addSay2(val: string) {
    console.log(val)
    return function (target: any) {
        console.log(2)
    }
}
function addSay3(val: string) {
    console.log(val)
    return function (target: any) {
        console.log(3)
    }
}
@addSay1('a1')
@addSay2('a2')
@addSay3('a3')  // = addSay(Person);
class Person{

}  // a1 a2 a3 3 2 1
// 裝飾類可以給類擴(kuò)展功能锰悼,需要在tsconfig.json開啟 experimentalDecorators:true
    1. 裝飾類中的屬性
function toUpperCase(target: any, key: string){  // target 類的原型柳骄,key就是修飾的屬性
  let val: string = ''
  Object.defineProperty(target, key, {  // 原型定義屬性
    get(){
      return val.toUpperCase()
    },
    set(newVal: string){
      val = newVal
    }
  })
}

function double(num: number){
  return function(target: any, key: string){
    let v = target[key]
    Object.defineProperty(target, key, {
      get(){
        return num * v
      }
    })
  }
}

class Person{
  @toUpperCase
  public name: string = 'Tom';  // 修飾的是實(shí)例,裝飾器指的就是原型

  @double(2)
  static age: number = 18;  // 修飾的是靜態(tài)屬性箕般,裝飾器指的就是類
}

let p = new Person();
console.log(p.name) // TOM
console.log(Person.age)  // 36 靜態(tài)屬性需要通過類來調(diào)用
    1. 裝飾類中的方法
function Enum(bool: boolean){  // 修改方法不能枚舉
  return function (target: any, key: string, descriptor: PropertyDescriptor){  // target 指原型
    descriptor.enumerable = bool
  }
}

class Person{
  @Enum(false)
  drink(){}
}
let p = new Person();
console.log(p)
    1. 裝飾參數(shù)
function params(target: any, key: string, index: number){  // target 原型 key 指方法drink index 索引0
  console.log(key, index)
}

class Person{
  drink(@params content: any){}  // 修飾參數(shù)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耐薯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌曲初,老刑警劉巖体谒,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臼婆,居然都是意外死亡抒痒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門颁褂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來故响,“玉大人,你說我怎么就攤上這事颁独〔式欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵誓酒,是天一觀的道長惨缆。 經(jīng)常有香客問我,道長丰捷,這世上最難降的妖魔是什么坯墨? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮病往,結(jié)果婚禮上捣染,老公的妹妹穿的比我還像新娘。我一直安慰自己停巷,他們只是感情好耍攘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畔勤,像睡著了一般蕾各。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庆揪,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天式曲,我揣著相機(jī)與錄音,去河邊找鬼缸榛。 笑死吝羞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的内颗。 我是一名探鬼主播钧排,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼均澳!你這毒婦竟也來了恨溜?” 一聲冷哼從身側(cè)響起符衔,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糟袁,沒想到半個月后柏腻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡系吭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年五嫂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肯尺。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沃缘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出则吟,到底是詐尸還是另有隱情槐臀,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布氓仲,位于F島的核電站水慨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏敬扛。R本人自食惡果不足惜晰洒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啥箭。 院中可真熱鬧谍珊,春花似錦、人聲如沸急侥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坏怪。三九已至贝润,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铝宵,已是汗流浹背打掘。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捉超,地道東北人胧卤。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓唯绍,卻偏偏與公主長得像拼岳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子况芒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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