国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

【前端】你好,我叫TypeScript (五)裝飾器

開(kāi)發(fā) 前端
裝飾器是一種特殊類型的聲明,它能夠被附加到類聲明,方法,訪問(wèn)符,屬性和參數(shù)上,裝飾器是一個(gè)表達(dá)式,表達(dá)式被執(zhí)行后,返回一個(gè)函數(shù)。

[[406096]]

1.什么是裝飾器

裝飾器是一種特殊類型的聲明,它能夠被附加到類聲明,方法,訪問(wèn)符,屬性和參數(shù)上。

  • 裝飾器是一個(gè)表達(dá)式
  • 表達(dá)式被執(zhí)行后,返回一個(gè)函數(shù)
  • 函數(shù)的輸入?yún)?shù)為:target,name和descriptor
  • 執(zhí)行函數(shù)后,可能返回descriptor對(duì)象,用于配置target對(duì)象

裝飾器使用@expression形式,expression求值后必須返回一個(gè)函數(shù),他會(huì)在運(yùn)行時(shí)被調(diào)用,被裝飾的聲明信息作為參數(shù)傳入。

例如:

  1. // 定義裝飾器 
  2. function testDecorator(target: anykey: string): void { 
  3.   console.log("Target: ", target ); 
  4.   console.log("key: "key); 
  5.  
  6. // 使用裝飾器 
  7. class Boat{ 
  8.   color: string = "yellow"
  9.  
  10.   get formattedColor(): string{ 
  11.     return  `this boat color is ${this.color}`; 
  12.      
  13.   } 
  14.    
  15.   @testDecorator 
  16.   pilot(): void{ 
  17.     console.log("swish"); 
  18.      
  19.   } 
  20.  
  21. // 實(shí)例化 
  22. const boat = new Boat(); 
  23. boat.pilot(); 
  24. console.log(boat.formattedColor); 

運(yùn)行得到:

  1. Target:  {} 
  2. key:  pilot 
  3. swish 
  4. this boat color is yellow 

2.裝飾器分類

裝飾器根據(jù)其所裝飾的類型分為以下一種:

  • 類裝飾器
  • 屬性裝飾器
  • 方法裝飾器
  • 參數(shù)裝飾器

若要啟用實(shí)驗(yàn)性的裝飾器特性,你必須在命令行或tsconfig.json里啟用experimentalDecorators編譯器選項(xiàng):

命令行:

  1. tsc --target ES5 --experimentalDecorators 

tsconfig.json:

  1.     "compilerOptions": { 
  2.         "target""ES5"
  3.         "experimentalDecorators"true 
  4.     }     

2.1 類裝飾器

類裝飾器用于類構(gòu)造函數(shù),進(jìn)行監(jiān)聽(tīng)、修改或替換類定義,在類聲明之前進(jìn)行聲明(緊挨著類聲明)。

切記:

  • 類裝飾器不能用在聲明文件中(.d.ts),也不能用在任何外部上下文中。
  • 類裝飾器表達(dá)式會(huì)在運(yùn)行時(shí)當(dāng)作函數(shù)被調(diào)用,類的構(gòu)造函數(shù)作為其唯一的參數(shù)。
  • 如果類裝飾器返回一個(gè)值,它會(huì)使用提供的構(gòu)造函數(shù)來(lái)替換類的聲明。
  • 如果你要返回一個(gè)新的構(gòu)造函數(shù),你必須注意處理好原來(lái)的原型鏈。在運(yùn)行時(shí)的裝飾器調(diào)用邏輯中不會(huì)為你做這些。

類裝飾器聲明:

  1. declare  type ClassDecorator = <TFunction extends Function>( 
  2.   target: TFunction 
  3. )=>TFunction | void; 

類裝飾器顧名思義,就是⽤來(lái)裝飾類的。它接收⼀個(gè)參數(shù):

  • target: TFunction - 被裝飾的類

栗子:

  1. // 類裝飾器 
  2. function classDecorator(constructor: typeof Boat){ 
  3.   console.log(constructor); 
  4.    
  5.  
  6. // 使用類裝飾器 
  7. @classDecorator 
  8. class Boat{ 
  9.  

運(yùn)行結(jié)果:

  1. [class Boat] 

2.2 方法裝飾器

方法裝飾器用于方法的屬性描述符,可以進(jìn)行監(jiān)聽(tīng)、修改或替換方法定義,在待修飾方法聲明前進(jìn)行聲明。方法裝飾器不能用在聲明文件(.d.ts),重載或者任何外部上下文中。

方法裝飾器表達(dá)式會(huì)在運(yùn)行時(shí)當(dāng)作函數(shù)被調(diào)用,傳入下列3個(gè)參數(shù):

  • target:被裝飾的類
  • key: 方法名
  • descriptor: 屬性描述符

「注意:如果代碼輸出目標(biāo)版本小于ES5,屬性描述符將會(huì)是undefined。」

如果方法裝飾器返回一個(gè)值,它會(huì)被用作方法的屬性描述符。

舉個(gè)栗子:

  1. // 定義裝飾器 
  2. function testDecorator(target: anykey: string): void { 
  3.   console.log("Target: ", target ); 
  4.   console.log("key: "key); 
  5.  
  6. function logError(errorMessage: string){ 
  7.   return function(target: anykey: string, desc: PropertyDescriptor){ 
  8.     const method = desc.value; 
  9.     desc.value = function(){ 
  10.       try { 
  11.         method(); 
  12.       }catch(err){ 
  13.         console.log(errorMessage); 
  14.          
  15.       } 
  16.     } 
  17.   } 
  18.  
  19. // 使用裝飾器 
  20. class Boat{ 
  21.   color: string = "yellow"
  22.  
  23.   @testDecorator 
  24.   get formattedColor(): string{ 
  25.     return  `this boat color is ${this.color}`; 
  26.      
  27.   } 
  28.  
  29.   @logError("Oops boat was sunk in ocean"
  30.   pilot(): void{ 
  31.     throw new Error() 
  32.     console.log("swish"); 
  33.      
  34.   } 
  35.  
  36. // 實(shí)例化 
  37. const boat = new Boat(); 
  38. boat.pilot(); 

運(yùn)行得到:

  1. Target:  {} 
  2. key:  formattedColor 
  3. Oops boat was sunk in ocean 

2.3 屬性裝飾器

屬性裝飾器屬性描述符只能用來(lái)監(jiān)視類中是否聲明了某個(gè)名字的屬性,在屬性聲明前進(jìn)行聲明。

屬性裝飾器表達(dá)式會(huì)在運(yùn)行時(shí)當(dāng)做函數(shù)進(jìn)行調(diào)用,傳入兩個(gè)參數(shù):

  • target: 被裝飾的類
  • key: 被裝飾類的屬性名字

注意:屬性描述符不作為參數(shù)傳入屬性裝飾器。因?yàn)槟壳斑€沒(méi)有辦法在定義一個(gè)原型對(duì)象時(shí)描述一個(gè)實(shí)例屬性,并且沒(méi)有辦法進(jìn)行建議監(jiān)聽(tīng)或修改一個(gè)屬性的初始化方法。

  1. // 定義裝飾器 
  2. function testDecorator(target: anykey: string): void { 
  3.   console.log("Target: ", target ); 
  4.   console.log("key: "key); 
  5.  
  6. function logError(errorMessage: string){ 
  7.   return function(target: anykey: string, desc: PropertyDescriptor){ 
  8.     const method = desc.value; 
  9.     desc.value = function(){ 
  10.       try { 
  11.         method(); 
  12.       }catch(err){ 
  13.         console.log(errorMessage); 
  14.          
  15.       } 
  16.     } 
  17.   } 
  18.  
  19. // 使用裝飾器 
  20. class Boat{ 
  21.   @testDecorator 
  22.   color: string = "yellow"
  23.  
  24.   // @testDecorator 
  25.   get formattedColor(): string{ 
  26.     return  `this boat color is ${this.color}`; 
  27.      
  28.   } 
  29.  
  30.   @logError("Oops boat was sunk in ocean"
  31.   pilot(): void{ 
  32.     throw new Error() 
  33.     console.log("swish"); 
  34.      
  35.   } 

運(yùn)行結(jié)果:

  1. Target:  {} 
  2. key:  color 

2.4 參數(shù)裝飾器

參數(shù)裝飾器用于類構(gòu)造函數(shù)或方法聲明。接收三個(gè)參數(shù):

  • target: 被裝飾的類
  • key:方法名
  • index:方法中的參數(shù)索引值
  1. // 定義裝飾器 
  2. function testDecorator(target: anykey: string): void { 
  3.   console.log("Target: ", target ); 
  4.   console.log("key: "key); 
  5.  
  6. function logError(errorMessage: string){ 
  7.   return function(target: anykey: string, desc: PropertyDescriptor){ 
  8.     const method = desc.value; 
  9.     desc.value = function(){ 
  10.       try { 
  11.         method(); 
  12.       }catch(err){ 
  13.         console.log(errorMessage); 
  14.          
  15.       } 
  16.     } 
  17.   } 
  18.  
  19. // 參數(shù)裝飾器 
  20. function parameterDecorator(target: anykey: string, index: number){ 
  21.   console.log(keyindex); 
  22.    
  23.  
  24. // 使用裝飾器 
  25. class Boat{ 
  26.   @testDecorator 
  27.   color: string = "yellow"
  28.  
  29.   // @testDecorator 
  30.   get formattedColor(): string{ 
  31.     return  `this boat color is ${this.color}`; 
  32.      
  33.   } 
  34.  
  35.   @logError("Oops boat was sunk in ocean"
  36.   pilot(): void{ 
  37.     throw new Error() 
  38.     console.log("swish"); 
  39.      
  40.   } 
  41.  
  42.  
  43.   fast( 
  44.     @parameterDecorator speed: string, 
  45.     @parameterDecorator generateWake: boolean 
  46.   ): void{ 
  47.     if(speed === "fast"){ 
  48.       console.log("swish"); 
  49.     }else
  50.       console.log("nothing"); 
  51.        
  52.     } 
  53.   } 

運(yùn)行結(jié)果:

  1. Target:  {} 
  2. key:  color 
  3. fast 1 
  4. fast 0 

小結(jié)

我們看到裝飾器很方便為我們結(jié)果了許多問(wèn)題。裝飾器根據(jù)其裝飾的對(duì)象不同,分為:類裝飾器、屬性裝飾器、方法裝飾器、參數(shù)裝飾器。

 

責(zé)任編輯:姜華 來(lái)源: 前端萬(wàn)有引力
相關(guān)推薦

2021-05-20 07:31:25

TypeScript前端數(shù)據(jù)類型

2021-05-25 07:39:18

TypeScript 前端函數(shù)與類

2021-05-18 07:37:18

前端TypeScript數(shù)據(jù)類型

2021-05-19 07:35:53

TypeScript變量和接口前端

2024-02-26 00:00:00

TypeScript裝飾器decorators

2023-08-07 16:07:42

2022-09-26 09:02:54

TS 裝飾器TypeScript

2022-05-10 09:12:16

TypeScript裝飾器

2021-10-14 14:00:44

996加班工作

2025-04-07 04:00:00

AngularTypeScript裝飾器

2021-02-20 13:55:35

程序員計(jì)算機(jī)技術(shù)

2022-01-19 08:21:12

設(shè)計(jì)裝飾器模式

2020-08-04 11:35:38

Vue前端裝飾器

2022-03-07 05:53:41

線程CPU代碼

2022-10-18 07:17:31

2025-10-28 01:22:00

HTTP狀態(tài)碼系統(tǒng)

2021-05-11 09:27:54

裝飾器模式代碼開(kāi)發(fā)

2023-02-07 07:47:52

Python裝飾器函數(shù)

2010-02-01 17:50:32

Python裝飾器

2021-02-18 15:43:37

Python裝飾器Decorator
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

99久久精品一区二区成人| 不卡中文字幕| 午夜精品久久久| 嫩草影院国产精品| 日韩av不卡一区二区| 国产精品有限公司| 清纯唯美日韩| 日韩免费不卡av| aa亚洲一区一区三区| 亚洲国产精品一区二区三区| 男女污视频在线观看| 亚洲一区二区三区中文字幕在线| 自拍偷拍21p| 欧美激情一区二区三区全黄| 可以在线看黄的网站| 日韩精品欧美精品| 国产98在线|日韩| 一区二区三区毛片免费| 成人做爰www免费看视频网站| 欧美裸体在线版观看完整版| 国产suv精品一区二区三区88区| 麻豆精品av| 97精品一区二区视频在线观看| 免费精品一区| 欧美激情在线视频二区| 亚洲天堂中文字幕在线观看| 午夜精品久久久久久久99热浪潮 | 九色视频在线观看免费播放| 草美女在线观看| 久久久久久一二三区| 久久久精品一区二区| 成人国产一区二区| 免费国产在线视频| 午夜免费一区| 久久伊人精品视频| 国产a视频免费观看| 91啪亚洲精品| 日本不卡在线观看视频| 欧美激情一区二区三区全黄| 国产经典第一页| 一色屋精品亚洲香蕉网站| 能在线观看av网站| 欧美午夜无遮挡| 色开心亚洲综合| 亚洲精品xxxx| 99久久这里有精品| 18久久久久久| 亚洲福利一区| 97久久国产亚洲精品超碰热| 国产精品视频在线看| ga∨成人网| 91精品国产黑色紧身裤美女| 欧亚一区二区| 国产69久久精品成人| 欧美1级日本1级| 中国人体摄影一区二区三区| 国产精品一二二区| 少妇一级淫免费放| 欧美性猛交xxxx黑人猛交| 中文在线观看免费| 久久精品中文字幕一区| 999视频精品| 中文字幕在线亚洲三区| 国产午夜精品美女毛片视频| 亚州av中文字幕在线免费观看| 91精品国产综合久久精品麻豆 | 极品美乳网红视频免费在线观看| 精品日韩在线观看| 一区二区三区在线免费看 | 国产亚洲字幕| 国产精品高精视频免费| 国产亚洲欧洲| 北条麻妃在线视频| 欧美午夜寂寞影院| 999精品视频在线观看| 亚洲tv在线观看| 国产精品一品视频| 一二三区在线| 夜夜嗨av色一区二区不卡| 日韩激情在线| 成人在线观看你懂的| 日韩欧美国产高清91| 欧美日韩破处视频| 久久久www免费人成黑人精品| 久久久亚洲国产美女国产盗摄| 日本最新在线视频| 91国内免费在线视频| 美腿丝袜一区二区三区| 网址你懂得在线观看| 久久视频在线看| 国产精品久久国产愉拍| 免费成人看片| 色妞一区二区三区| 久久精品天堂| 亚洲综合色视频在线观看| 久久色精品视频| 久久婷婷av| 亚洲欧美另类图片| 国内精品一区二区三区四区| 极品尤物av久久免费看| 欧美色综合一区二区三区| 91国语精品自产拍在线观看性色| 国内外成人在线| 欧美午夜免费电影| 91久久在线| 欧美日韩在线成人| 日韩精品免费视频| 国产精品主播| 三级在线播放| 国产成人精品999| 国产乱淫av一区二区三区 | 亚洲最大福利网站| 国产欧美一区二区精品忘忧草| av福利导福航大全在线| 黑人巨大精品| 日韩欧美卡一卡二| 999国产精品永久免费视频app| 久久视频这里有精品| 日韩欧美激情在线| 夜久久久久久| 尤物在线视频| 99一区二区| 欧美视频在线免费| 欧美精选一区二区三区| wwwwxxxx日韩| 超薄丝袜一区二区| av亚洲精华国产精华精| 美女福利一区二区| 亚洲精品视频一二三| 555www色欧美视频| 日韩一级免费| www.在线视频| 亚洲欧美日韩精品在线| 久久综合一区二区| jizz国产精品| 亚洲人成无码网站久久99热国产 | 国产高清一区| www欧美激情| 欧美另类第一页| 高清成人免费视频| 日韩一区二区三区免费视频| 天堂v在线视频| 在线色欧美三级视频| 国产成人精品三级麻豆| 亚洲伊人精品酒店| 丰满少妇在线观看| 国产成人精品日本亚洲专区61| 亚洲综合免费观看高清完整版 | 欧洲毛片在线| 国产一区二区高清不卡| 欧美日韩一区在线观看| 亚洲人成免费| 丰满诱人av在线播放| 在线观看成人免费| 久久午夜a级毛片| 亚洲美女偷拍久久| 欧美视频网站| 97超碰在线免费| 日韩国产欧美亚洲| 97色在线视频观看| 欧美视频在线观看免费网址| 亚洲东热激情| av在线日韩| 国产三级免费观看| 国产成人精品福利一区二区三区 | 夜夜嗨av色综合久久久综合网 | 无码日本精品xxxxxxxxx| 在线视频日韩精品| 日韩美女啊v在线免费观看| 精品国产视频| 2024短剧网剧在线观看| 99在线观看视频免费| 欧美在线视频网| 欧美日韩一级二级| 国产一区二区三区精品久久久| 国产综合久久久久影院| 精品日韩在线| 国产一区二区三区黄网站| 成年人免费在线视频| 精品国产aⅴ麻豆| 亚洲午夜色婷婷在线| 亚洲午夜国产一区99re久久| 久久爱www久久做| 久久天天久久| 婷婷久久伊人| 久热精品视频在线观看| 亚洲一区二区在线观看视频| 久久狠狠婷婷| 爱高潮www亚洲精品| 九色国产在线观看| 国产精品久久成人免费观看| 91精品国产91久久久久久吃药 | 天天免费综合色| 久久福利资源站| 国产一区二区三区日韩精品 | 日韩精品免费一区二区三区竹菊| 麻豆免费在线视频| 我看黄色一级片| 日韩av不卡在线播放| 庆余年2免费日韩剧观看大牛|