最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

TypeScript 高級語法——Class(二)

2023-08-08 14:36 作者:沒用軟件開發(fā)日記  | 我要投稿

?????關(guān)于類分成多篇文章發(fā)出,ES為了面向?qū)ο笤黾臃浅6嗟乃季S維度。

? ? 這個例子中使用了關(guān)鍵字“extends”,該關(guān)鍵字表示class的繼承,也就是說Person類會獲得Base中的所有公開(public修飾符修飾的,未聲明則默認(rèn)public)、受保護(hù)(protected修飾符修飾的)成分(字段name、方法say)作為自己的組成部分(Person包含Base所有的組成元素),這里所說的作為自己的組成部分其實是方便理解的一種說法,真實情況是我們可以通過Person去訪問Base的公開、受保護(hù)對象。

????受保護(hù)修飾符protected的意思為只可以在直接派生類中使用,也就是說類實例不可訪問,但是類函數(shù)內(nèi)部可以訪問。這里要注意一點,TS的訪問保護(hù)系統(tǒng)與其他OOP不同的是只能對直接父級受保護(hù)對象發(fā)起訪問,不可跨級。

????與TypeScript類型系統(tǒng)的其他方面一樣,private和protected只在類型檢查期間強(qiáng)制執(zhí)行,TS在ES2021之前會將私有對象用WeekMap翻譯,2021之后會使用ES的私有標(biāo)記,也就是說protected修飾符編譯后的JS代碼不會有可訪問檢查能力。

????第二個重點是構(gòu)造函數(shù)construct內(nèi)部的super函數(shù),它意味著調(diào)用上級構(gòu)造函數(shù),也就是說super其實是對Base類構(gòu)造函數(shù)(Base未聲明構(gòu)造函數(shù)則獲得了一個默認(rèn)的空函數(shù)為構(gòu)造函數(shù))的調(diào)用,所以這樣理解的話就很輕松的能明白為什么在super執(zhí)行之前無法使用this,因為當(dāng)前類的父級還未被初始化成功,也就是說當(dāng)前類存在缺陷無法正常提供服務(wù)。

????本例中如果Person也不需要構(gòu)造函數(shù)則可以省略,不必顯示的在Person中寫一個構(gòu)造函數(shù)去執(zhí)行super,默認(rèn)的構(gòu)造函數(shù)會代替我們執(zhí)行這一過程。

????示例中使用this.k在構(gòu)造時為Person類添加公開字段,這種做法現(xiàn)在有更好的替代方案,就如Base類內(nèi)部name字段的聲明一樣,對開發(fā)人員來講這是一個關(guān)注點分離的邏輯,開發(fā)人員可以在固定的地方知道自己想知道的所有東西,而不是依靠類內(nèi)部隨時可能出現(xiàn)的“this.”動態(tài)追加。

????訪問類內(nèi)部字段只能使用“this”,類內(nèi)部出現(xiàn)的this在不被解包的場景下會指向本級類(Person內(nèi)部的this指向Person,Base內(nèi)部的this指向Base,因為Person可以訪問Base的公開對象,所以Person內(nèi)部的this可以訪問到Base的公開部分但是訪問不到Base的私有部分)。

????Base中的age字段前的#是ES規(guī)范里對private訪問修飾符的表示方法,所以私有字段是真實存在的,這一點和受保護(hù)字段完全不同。

??TS類型系統(tǒng)還為Class提供了索引的類型描述,上例通過將索引的返回值標(biāo)記為boolean和返回布爾值的函數(shù)規(guī)定了類內(nèi)部的組成成分。

????這個示例展示了屬性訪問器的寫法,它和方法很像只不過多了一個關(guān)鍵字修飾。“get”關(guān)鍵字標(biāo)記只讀訪問器、“set”關(guān)鍵字標(biāo)記只寫訪問器,get和set可以不成對存在(只存在只讀訪問器或者只存在只寫訪問器)。

????當(dāng)類內(nèi)get訪問器沒有對應(yīng)的set訪問器時,試圖去修改只讀訪問器的結(jié)果在編碼階段TS會提示錯誤,在編譯后瀏覽器環(huán)境會忽略此次賦值無任何警告、報錯。

????屬性訪問器其實本質(zhì)上是一種代理模式,通過對寫動作的攔截增加寫的邏輯、對讀動作的攔截用對象本身的字段組成新的數(shù)據(jù)格式。

??????類一樣可以被接口約束,這里使用關(guān)鍵字“implements”表示Sonar類遵從于接口Pingable的約束,也就是說Sonar必須實現(xiàn)簽名為“ping( ): void;”的函數(shù),如上例中所示:Sonar類中具有一個名為ping的函數(shù),無參無返回值。

????該示例中的字段類型覆寫意為DogHouse雖然繼承了AnimalHouse但是resident的類型從Animal改為Dog。

????這個示例中體現(xiàn)的是字段的覆寫,但是這種做法可能出乎初學(xué)者的意料,ES標(biāo)準(zhǔn)中類型的初始化過程是這樣的:

????1、Base初始化字段

????2、Base的構(gòu)造函數(shù)運行

????3、Derived初始化字段,在這個過程中Derived發(fā)現(xiàn)name字段有值則跳過默認(rèn)值賦予的過程

????4、Derived構(gòu)造函數(shù)運行

所以才會出現(xiàn)name的值是base的結(jié)果,如果我們希望派生類的字段可以覆寫基類name應(yīng)該在構(gòu)造函數(shù)中執(zhí)行賦值動作。

????這個例子中兩個類的name字段訪問修飾符都是public,如果Base的訪問修飾符可訪問級別小于public,Derived的name字段的訪問修飾級別public將會覆蓋原有級別,在Derived實例中就可以訪問Base實例訪問不到的name字段了。

????上例為類靜態(tài)字段,這些成員不與類的特定實例相關(guān)聯(lián)。它們可以通過類構(gòu)造函數(shù)對象本身來訪問。使用方式如上例的printX,通過類名直接調(diào)用,靜態(tài)字段前也可以增加訪問修飾符,確保只能在類內(nèi)部使用。


TypeScript 高級語法——Class(二)的評論 (共 條)

分享到微博請遵守國家法律
正阳县| 获嘉县| 新乡县| 奇台县| 江源县| 彰武县| 康定县| 绥化市| 密云县| 隆回县| 五华县| 沂源县| 宁德市| 新余市| 宜春市| 罗源县| 通化市| 鄱阳县| 龙海市| 搜索| 平定县| 光泽县| 乡宁县| 吉安市| 霍州市| 上犹县| 静乐县| 赣州市| 南溪县| 宜兴市| 特克斯县| 盐亭县| 涡阳县| 探索| 沧源| 聂荣县| 绥棱县| 洞头县| 贵州省| 沁水县| 和林格尔县|