国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【TypeScript】中定義與使用 Class 類的解讀理解

這篇具有很好參考價值的文章主要介紹了【TypeScript】中定義與使用 Class 類的解讀理解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【TypeScript】中定義與使用 Class 類的解讀理解,TypeScript,typescript,javascript,前端

類的概念

類是用于創(chuàng)建對象的模板。他們用代碼封裝數(shù)據(jù)以處理該數(shù)據(jù)。JavaScript 中的類建立在原型上,但也具有某些語法和語義未與 ES5 類相似語義共享。


TypeScript 除了實現(xiàn)了所有 ES6 中的類的功能以外,還添加了一些新的用法。

關(guān)于ES6的 Class 類語法概念,在本章節(jié)不做過多闡述,感興趣的的小伙伴 可以 點擊這里,了解查看更多 ES6中有關(guān)Class的語法概念使用。

本章節(jié)還是主要給大家?guī)?,?TypeScript 中,如何去定義 Class 【類】,以及如何去使用 類身上的 屬性及方法。

定義Class : 使用 Class 定義類,使用 constructor 定義構(gòu)造函數(shù)。

在原生 JavaScript

class Rectangle {
    constructor(height, width) {
        this.height = height;
        this.width = width;
    }
}
new Rectangle(1, 2)   //實例化,并傳入?yún)?shù)

上面的是,在JS中,Class 類的常用定義方式。

而在TypeScript 中定義 Class 類:

class identity {
    name: string;   //TS 中需要對要接受的參數(shù)初始化
    age: number;
    constructor(name: string, age: number) {    //為要傳入的參數(shù)指定類型。不指定類型,默認(rèn)為Any 類型。
        this.name = name;
        this.age = age;
    }
    sayHi() {
        return `我叫 ${this.name},今年${this.age}`;
    }
}
let a = new identity('張三', 20);
console.log(a);    //Animal {name: '張三', age: 20}

console.log(a.sayHi());  //我叫 張三,今年20歲

類的繼承 :

使用 extends 關(guān)鍵字實現(xiàn)繼承,子類中使用 super() 關(guān)鍵字來調(diào)用父類的構(gòu)造函數(shù)和方法。

class identity {   //父類
    name: string;
    age: number;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    sayHi() {
        return `我叫 ${this.name},今年${this.age}`;
    }
}

//子類
class copy extends identity {   
    //由于我繼承了 identity ,在 identity 身上已經(jīng)存在了 name 和 age
    // 所以 在 copy 類里面就不用再定義 name 和 age了,繼承后可以直接讀取到,所繼承類身上的屬性方法。
    constructor(name: string, age: number) {
        super(name, age)              // super 繼承
    }
}
let c = new copy("李四", 30) //實例化子類
console.log(c);  //copy {name: '李四', age: 30}

//可以調(diào)用父類身上的方法。
console.log(c.sayHi());   //我叫 李四,今年30歲

類的存取器:

使用 getter 和 setter 可以改變屬性的賦值和讀取行為。

存取器的作用:可以用來更專注化的控制對,對象屬性方法的讀取和修改。

class identity {   //父類
    name: string;
    age: number;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    //設(shè)置讀取器=》,用來讀取數(shù)據(jù)
    get names() {
        return "getter" + `我叫 ${this.name},今年${this.age}`;
    }

    //設(shè)置存儲器,用來修改數(shù)據(jù)
    set names(val: string) {
        console.log("這是set 傳入進(jìn)來的值", val);
    }
}

let a = new identity("張三", 18);
console.log(a.names);  //當(dāng)我們訪問讀取器的時候會觸發(fā)get,會直接得到返回的值 : getter張三18
a.names = "李四" //當(dāng)我們?yōu)榇鎯ζ髻x值的時候,會觸發(fā) set 并且會把,賦值,當(dāng)成參數(shù),傳遞給 set。

使用 存儲器的好處:對屬性方法的讀取和修改,更加的專業(yè)化,不同的存取器,負(fù)責(zé)不同的邏輯處理,這里的存取器,也相似于 Vue 中的 computed 計算屬性。 以及 Object.defineProperty()的 get 和 set 方法 類似。


類的靜態(tài)方法與靜態(tài)屬性:

有時候,我們希望 類中所定義的屬性或者方法,不想被實例化后的對象讀取,不需要實例化,那么,我們就可以通過 static 關(guān)鍵字,來把 屬性或方法定義為靜態(tài)成員來實現(xiàn)。

class identity {
    static username: string = "asdasd";    //將 username  通過 static 設(shè)置為靜態(tài)屬性。并為其賦值。
    name: string
    age: number;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
        console.log(this.username);  //也會報錯,類的內(nèi)部也不能拿取 username
    }

    //將方法設(shè)置為 靜態(tài)方法
    static bolkfn() {
        console.log("靜態(tài)方法");
    }
}



let a = new identity("張三", 18);

console.log(identity.username);  // 類自身訪問靜態(tài)屬性,不會報錯

console.log(a.username);      //實例對象訪問靜態(tài)屬性,會報錯 :屬性“username”在類型“identity”上不存在。


console.log(identity.bolkfn());  // 類自身訪問靜態(tài)方法,不會報錯

console.log(a.bolkfn());      //實例對象訪問靜態(tài)方法,會報錯 :屬性“bolkfn”在類型“identity”上不存在。

擴(kuò)展知識點

在ES7 中有一些關(guān)于類的新特性提案,TypeScript 也實現(xiàn)了它們,這里做一個簡單的介紹。

ES6 中實例的屬性只能通過構(gòu)造函數(shù)中的 this.xxx 來定義,而在 ES7 提案中可以直接在類里面定義:

class Animal {
  name = 'Jack';  //可以直接在類中定義,非必須要在 constructor 通過 this.name 來定義。

  constructor() {
    // ...
  }
}

let a = new Animal();
console.log(a.name); // Jack 可以直接讀取到name屬性 

類的修飾符:

TypeScript 可以使用三種訪問修飾符(Access Modifiers),分別是 publicprivate protected。

  • public :修飾的屬性或方法是公有的,可以在任何地方被訪問到,默認(rèn)所有的屬性和方法都是 public
  • private 修飾的屬性或方法是私有的,不能在聲明它的類的外部訪問,雖然 子類 可以通過 extends 繼承它的私有屬性,但是卻無法讀取。
  • protected : 修飾的屬性或方法是受保護(hù)的,它和 private 類似,區(qū)別是它在子類中也是允許被訪問的,也依然無法在外部訪問

例:
public

class Animal {
  public name;
  public constructor(name) {
    this.name = name;
  }
}
let a = new Animal('Jack');
console.log(a.name); // Jack
a.name = 'Tom';
console.log(a.name); // Tom

private

class Animal {
    private name;   //設(shè)置私有化
    public constructor(name) {
        this.name = name;
    }
}

let a = new Animal('Jack');
console.log(Animal.name);  //只能自身讀取

console.log(a.name);  //報錯
a.name = 'Tom';   //報錯

即使通過子類繼承,在子類繼承中也不能訪問讀取

class Animal {
  private name;
  public constructor(name) {
    this.name = name;
  }
}
class Cat extends Animal {
  constructor(name) {
    super(name);
    console.log(this.name);   //報錯,子類繼承中也無法訪問私有化數(shù)據(jù)
  }
}

當(dāng)構(gòu)造函數(shù)修飾為 private 時,該類 允許被繼承或者實例化:

class Animal {
    public name;
    private constructor(name) {  //構(gòu)造函數(shù) private 私有化
      this.name = name;
    }
  }
  class Cat extends Animal {  //報錯不能被繼承
    constructor(name) {
      super(name);
    }
  }
  
  let a = new Animal('Jack');  //報錯,不應(yīng)該被實例化

protected

當(dāng)使用 protected 修飾,則 允許 在子類中訪問:

class Animal {
  private name;
  public constructor(name) {
    this.name = name;
  }
}
class Cat extends Animal {
  constructor(name) {
    super(name);
    console.log(this.name);   //不會報錯,子類繼承中可以訪問
  }
}

當(dāng)構(gòu)造函數(shù)修飾為 protected 時,該類只允許被繼承:

class Animal {
    public name;
    protected constructor(name: string) {
        this.name = name;
    }
}
class Cat extends Animal {
    constructor(name: string) {
        super(name);
    }
}

let a = new Animal('Jack');  //報錯,因為  Animal 只允許被繼承。

參數(shù)屬性:

上面,介紹的三種 修飾符,其實還有一種簡潔的寫法,被稱為 屬性參數(shù)寫法;修飾符還可以使用在構(gòu)造函數(shù)參數(shù)中,等同于類中定義該屬性同時給該屬性賦值,使代碼更簡潔。

class Animal {
    // public name;   //可以省略此處
    protected constructor(public name: string) {  //  private   protected  同理
        // this.name = name;   //可以省略此處
    }
}

readonly : 只讀屬性關(guān)鍵字,只允許出現(xiàn)在屬性聲明或索引簽名或構(gòu)造函數(shù)中。

class Animal {
  readonly name;
  public constructor(name) {
    this.name = name;
  }
}

let a = new Animal('Jack');
console.log(a.name); // Jack
a.name = 'Tom';    //會報錯,因為屬性為 只讀的,不能修改。

注意;
注意如果 readonly 和其他訪問修飾符同時存在的話,需要寫在其后面。

class Animal {
  // public readonly name;
  public constructor(public readonly name) {
    // this.name = name;
  }
}

抽象類:

概念:抽象類的概念是,專注于用來為子類服務(wù)的,抽象類是不允許被實例化的,只能通過被子類繼承。
語法:abstract 關(guān)鍵字用于定義抽象類和其中的抽象方法

abstract class Animal {  // 通過 abstract  定義一個抽象類
  public name;
  public constructor(name) {
    this.name = name;
  }
  public abstract sayHi();    //并且在抽象類里面,還可以定義 抽象方法
}

let a = new Animal('Jack');  //會報錯,抽象類不能被實例化

注意抽象類中的抽象方法或?qū)傩员仨毐蛔宇悓崿F(xiàn),否則在子類繼承抽象類后,實例化的時候會報錯

abstract class Animal {  // 通過 abstract  定義一個抽象類
    public name;
    public constructor(name) {
        this.name = name;
    }
    public abstract sayHi() { };    //并且在抽象類里面,還可以定義 抽象方法
}


class B extends Animal {
    public sayHi() {   //抽象類中,所定義抽象方法,必須要在子類中實現(xiàn)。
        console.log("繼承Animal");

    }
}
let isB = new B("")

類的類型:

給實例化的類,定義類型,簡述而言,就是定義的 class 類,還可以被用來當(dāng)做 一種類型,賦值給實例化的對象,用來校驗類的數(shù)據(jù)完整性。

案例說明:

class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  sayHi(): string {
    return `My name is ${this.name}`;
  }
}

// 把 Animal  當(dāng)做一種類型,用來校驗實例化對象 a 的規(guī)范性。
let a: Animal = new Animal('Jack');
console.log(a.sayHi()); // My name is Jack

總結(jié):

本章節(jié),主要給大家介紹了,在 TypeScript 中,如何去聲明 class 類,以及對 class 類的主要運(yùn)用解析。歡迎大家交流評論。


???♂? 博主座右銘:向陽而生,我還在路上!
——————————————————————————————
??博主想說:將持續(xù)性為社區(qū)輸出自己的資源,同時也見證自己的進(jìn)步!
——————————————————————————————
???♂? 如果都看到這了,博主希望留下你的足跡!【??收藏!??點贊!??評論!】
——————————————————————————————文章來源地址http://www.zghlxwxcb.cn/news/detail-629530.html

到了這里,關(guān)于【TypeScript】中定義與使用 Class 類的解讀理解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • TypeScript快速入門 - 類的使用

    1、類的聲明 ????????:class 2、類的繼承 ? ? ? ? :extends 3、類與接口 ? ? ? ? :implments 4、抽象類 ? ? ? ? :abstract 5、類的成員變量修飾符 ? ? ? ? 公開的:public ? ? ? ? 私有的:private ? ? ? ? 受保護(hù)的:protected ????????只讀的:re

    2024年01月21日
    瀏覽(21)
  • 【TypeScript】接口類型 Interfaces 的使用理解

    【TypeScript】接口類型 Interfaces 的使用理解

    導(dǎo)語 : 什么是 類型接口 ? 在面向?qū)ο笳Z言中 ,接口 (Interfaces) 是一個很重要的概念,它是對行為的抽象,而具體如何行動需要由類(classes)去實現(xiàn)(implement)。TypeScript 中的 類型接口 是一個非常靈活的概念,除了可用于 對類的一部分行為進(jìn)行抽象 以外,也常用于對「

    2024年02月15日
    瀏覽(23)
  • Typescript:類的裝飾器

    Typescript的裝飾器我在學(xué)習(xí)typescript的時候并不是很清楚它的作用場景,直到使用了nest.js框架后,才明白其作用,于是又深入學(xué)習(xí)了一下,希望通過對裝飾器的學(xué)習(xí)提高對nest.js的使用。 裝飾器為我們在類的聲明及成員上通過元編程語法添加標(biāo)注提供了一種方式 裝飾器 是一種特

    2024年02月16日
    瀏覽(15)
  • typeScript中的類以及類的限制

    傳統(tǒng)方法中,JavaScript通過構(gòu)造函數(shù)實現(xiàn)類的概念,通過原型鏈實現(xiàn)繼承。而在Es6中,我們終于迎來了class. typeScript除了實現(xiàn)了所有Es6中類的功能以外,還添加了一些新的用法。 雖然 JavaScript 中有類的概念,但是可能大多數(shù) JavaScript 程序員并不是非常熟悉類,這里對類相關(guān)的概

    2024年02月05日
    瀏覽(43)
  • Buf 教程 - 使用 Protobuf 生成 Golang 代碼和 Typescript 類型定義

    Buf 教程 - 使用 Protobuf 生成 Golang 代碼和 Typescript 類型定義

    Buf 是一款更高效、開發(fā)者友好的 Protobuf API 管理工具,不僅支持代碼生成,還支持插件和 Protobuf 格式化。 我們可以使用 Buf 替代原本基于 Protoc 的代碼生成流程,一方面可以統(tǒng)一管理團(tuán)隊 Protoc 插件的版本、代碼生成配置,另一方面可以簡化項目開發(fā)配置。 本文將會用兩部分

    2024年02月08日
    瀏覽(47)
  • TypeScript深度剖析:TypeScript 中命名空間與模塊的理解?區(qū)別?

    TypeScript深度剖析:TypeScript 中命名空間與模塊的理解?區(qū)別?

    TypeScript ?與 ECMAScript ?2015 一樣,任何包含頂級? import ?或者? export ?的文件都被當(dāng)成一個模塊 相反地,如果一個文件不帶有頂級的 import 或者 export 聲明,那么它的內(nèi)容被視為全局可見的 例如我們在在一個? TypeScript ?工程下建立一個文件? 1.ts ,聲明一個變量 a ,如下: 然

    2024年02月07日
    瀏覽(28)
  • TypeScript -類型斷言的簡單理解

    類型斷言 : 是手動的給某個變量 指定類型,從而可以方便操作該類型的屬性和方法。 方式一 : 變量名 as 類型 方式二 :類型 變量名 注意 : 1、類型斷言只是為了方便明確變量的類型,而不是將變量的類型進(jìn)行改變?。?! 2、因此,類型斷言在使用的時候,建議 在我們已

    2024年02月08日
    瀏覽(20)
  • feat:使用企業(yè)微信JS-SDK的onMenuShareAppMessage()實現(xiàn)點擊轉(zhuǎn)發(fā)自定義分享內(nèi)容(TypeScript)

    feat:使用企業(yè)微信JS-SDK的onMenuShareAppMessage()實現(xiàn)點擊轉(zhuǎn)發(fā)自定義分享內(nèi)容(TypeScript)

    背景:企業(yè)微信應(yīng)用使用企業(yè)微信JS-SDK的分享接口實現(xiàn)分享樣式自定義 原生: 需要實現(xiàn)成: 企業(yè)微信JS-SDK 是企業(yè)微信面向網(wǎng)頁開發(fā)者提供的 基于企業(yè)微信內(nèi) 的網(wǎng)頁開發(fā)工具包。 通過使用企業(yè)微信JS-SDK,網(wǎng)頁開發(fā)者 可借助企業(yè)微信 高效地使用拍照、選圖、語音、位置等手

    2024年02月07日
    瀏覽(20)
  • Java面試題Class類的理解?創(chuàng)建類的對象的方式?

    Java面試題Class類的理解?創(chuàng)建類的對象的方式?

    1.類的加載過程: 程序經(jīng)過 javac.exe 命令以后,會生成一個或多個字節(jié)碼文件(.class結(jié)尾)。 接著我們使用 java.exe 命令對某個字節(jié)碼文件進(jìn)行解釋運(yùn)行。相當(dāng)于將某個字節(jié)碼文件 加載到內(nèi)存中。此過程就稱為類的加載 。加載到內(nèi)存中的類,我們就稱為運(yùn)行時類,此運(yùn)行時類,

    2024年02月10日
    瀏覽(19)
  • TypeScript 自定義裝飾器

    TypeScript 自定義裝飾器

    (預(yù)測未來最好的方法就是把它創(chuàng)造出來——尼葛洛龐帝) 裝飾器一種更現(xiàn)代的代碼模式,通過使用@的形式注入在屬性,寄存器,方法,方法參數(shù)和類中,比如在Angular,Nestjs和midway等流行框架中也都用到了裝飾器。 官方說明 對裝飾器更詳細(xì)的相關(guān)說明 tc39提案一共分為五個

    2024年02月09日
    瀏覽(12)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包