亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

一文讀懂ES7中的javascript修飾器

2024-05-06 16:50:32
字體:
來源:轉載
供稿:網友

什么是修飾器

修飾器(Decorator)是javascript/339279.html">ES7的一個提案,它的出現能解決兩個問題:

  • 不同類間共享方法
  • 編譯期對類和方法的行為進行改變

用法也很簡單,就是在類或方法的上面加一個@符,在vue in typescript中經常用到

ES7,javascript,修飾器

以上的兩個用處可能不太明白,沒關系,我們開始第一個例子

例子1:修飾類

@setPropclass User {}function setProp(target) { target.age = 30}console.log(User.age)

這個例子要表達的是對User類使用setProp這個方法進行修飾,用來增加User類中age的屬性,setProp方法會接收3個參數,我們現在接觸第一個,target代表User類本身。

例子2:修飾類(自定義參數值)

@setProp(20)class User {}function setProp(value) { return function (target) {  target.age = value }}console.log(User.age)

此例和上面功能基本一致,唯一差別在于值是參考修飾函數傳過來的

例子2:修飾方法

class User { @readonly getName() {  return 'Hello World' }}// readonly修飾函數,對方法進行只讀操作function readonly(target, name, descriptor) { descriptor.writable = false return descriptor}let u = new User()// 嘗試修改函數,在控制臺會報錯u.getName = () => { return 'I will override'}

上例中,我們對User類中的getName方法使用readonly修飾器進行修飾,使得方法不能被修改。第一個參數我們已經知道了,參數name為方法名,也就是readonly,參數descriptor是個啥東西呢,看到這行descriptor.writable = false,我們大家猜的也差不多了,這三個參數對應的就是Object.defineProperty的三個參數,我們來看一下:

ES7,javascript,修飾器

我們設置descriptor.writable = false就是讓函數不可以被修改,如果我們寫成

descriptor.value = 'function (){ console.log('Hello decorator') }'

那么,輸出就是Hello World了,而是Hello decorator,是不是已經意識到修飾器的好處了?,F在我們來看看實際工作中,我們用到修飾器的例子

實際應用1:日志管理

在用webpack打包時,我們經常需要好多步驟,比如第一步讀取package.json文件,第二步處理該文件,第三步加載webpack.base.js文件,第四步進行打包...為了直觀,我們經常在每一步打印一些日志文件,比如這步都干了些什么事,很明顯打印日志的操作和業務代碼根本就一點關系沒有,我們不應該把日志和業務摻和在一起,這樣使用修飾器就是避免這個問題,以下為代碼:

class Pack { @log('讀取package.json文件') step1() {  // do something...  // 沒有修飾器之前,我們通常把console.log放到這里寫  // 放到函數里面寫會有兩個壞處  //  1.console和業務無關,會破壞函數單一性原則  //  2.如果要刪除所有的console,那我們只能深入到每一個方法中 } @log('合并webpack配置文件') step2() {  // do something... }}function log(value) { return function (target, name, descriptor) {  // 在這里,我們還可以拿到函數的參數,打印更加詳細的信息  console.log(value) }}let pack = new Pack()pack.step1()pack.step2()

實際應用2:檢查登錄

這個例子在實際的開發中常用得到,我們一些操作前,必須得判斷用戶是否登錄,比較點贊、結算、發送彈幕...按照之前的寫法,我們必須在每一個方法中判斷用戶的登錄情況,然后再進行業務的操作,很顯然前置條件和業務又混到了一起,用修飾器,就可以完美的解決這一問題,代碼如下:

class User { // 獲取已登錄用戶的用戶信息 @checkLogin getUserInfo() {  /**   * 之前,我們都會這么寫:   *  if(checkLogin()) {   *   // 業務代碼   *  }   * 這段代碼會在每一個需要登錄的方法中執行   * 還是上面的問題,執行的前提和業務又混到了一起   */  console.log('獲取已登錄用戶的用戶信息') } // 發送消息 @checkLogin sendMsg() {  console.log('發送消息') }}// 檢查用戶是否登錄,如果沒有登錄,就跳轉到登錄頁面function checkLogin(target, name, descriptor) { let method = descriptor.value // 模擬判斷條件 let isLogin = true descriptor.value = function (...args) {  if (isLogin) {   method.apply(this, args)  } else {   console.log('沒有登錄,即將跳轉到登錄頁面...')  } }}let u = new User()u.getUserInfo()u.sendMsg()

結語

以上只是修飾器的基本應用,只要我們掌握了原理,在實際的工作中,要思考自己的應用場景,只要我們涉及需要在執行前做一些處理的應用,不管是修改函數的參數值,還是增加屬性,還是執行的先決條件,我們都可以使用修飾器,這種編程的方式,就是面向切面編程

源碼以及使用方法,請移步GitHub

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久精品国产| 欧美另类极品videosbestfree| 正在播放亚洲1区| 国产精品久久久久久亚洲调教| 在线看欧美日韩| 亚洲第一区在线| 97**国产露脸精品国产| 亚洲国产天堂久久综合| 欧美一级大胆视频| 日本亚洲欧美三级| 亚洲电影免费观看高清| 国产精品久久久久久av| 国产成人自拍视频在线观看| 日产精品99久久久久久| 亚洲va欧美va国产综合剧情| 粉嫩老牛aⅴ一区二区三区| 精品中文字幕乱| 欧美有码在线观看视频| 5566日本婷婷色中文字幕97| 日韩成人网免费视频| 日韩视频永久免费观看| 亚洲欧美中文日韩v在线观看| 美女福利精品视频| 日韩在线视频网| 国产精品成人一区二区| 亚洲精品免费av| 98午夜经典影视| 日韩精品高清在线| 亚洲国产成人精品电影| 91伊人影院在线播放| 亚洲老头同性xxxxx| 91欧美精品成人综合在线观看| 91色视频在线观看| 亚洲色图偷窥自拍| 最近2019中文字幕在线高清| 国产精品吊钟奶在线| 欧美国产中文字幕| 欧美黄色片免费观看| 51ⅴ精品国产91久久久久久| 亚洲综合成人婷婷小说| 亚洲国产精品国自产拍av秋霞| 成人精品一区二区三区电影黑人| 亚洲自拍另类欧美丝袜| 日本精品视频在线观看| 亚洲成人激情小说| 在线观看成人黄色| 国产精品日韩在线| 精品毛片网大全| 欧美国产日韩视频| 91极品视频在线| 日韩欧美在线视频日韩欧美在线视频| 亚洲激情在线观看视频免费| 欧美日韩国产一区二区三区| 国产精品777| 亚洲欧洲在线视频| 欧美激情手机在线视频| 欧美麻豆久久久久久中文| 2019中文字幕在线免费观看| 欧美精品在线网站| 九九热这里只有精品免费看| 97不卡在线视频| 欧美日韩人人澡狠狠躁视频| 色无极影院亚洲| 欧美性猛交xxxx免费看漫画| 主播福利视频一区| 久久久久www| 成人免费观看49www在线观看| 国产日本欧美在线观看| 久久综合国产精品台湾中文娱乐网| 久久综合伊人77777| 欧美一区二区大胆人体摄影专业网站| 欧美电影在线免费观看网站| 国产又爽又黄的激情精品视频| 91美女片黄在线观看游戏| 亚洲精品国产综合区久久久久久久| 亚洲人成电影在线观看天堂色| 97在线免费观看| 亚洲一区亚洲二区| 久久久精品视频成人| 亚洲精品免费一区二区三区| 亚洲有声小说3d| 国产精品xxx视频| 欧美一级高清免费| 国产精品视频男人的天堂| 久久香蕉国产线看观看网| 成人黄色网免费| 日韩黄色高清视频| 国产精品一久久香蕉国产线看观看| 国产成人精品一区| 91在线视频精品| 国产日韩欧美自拍| 亚洲性夜色噜噜噜7777| 精品国内亚洲在观看18黄| 国产婷婷97碰碰久久人人蜜臀| 亚洲人永久免费| 国内精品久久久久影院 日本资源| 欧美中文字幕精品| 欧美色道久久88综合亚洲精品| 亚洲国产97在线精品一区| 日韩欧美主播在线| 欧美日韩ab片| 欧美在线性爱视频| 欧美成人精品不卡视频在线观看| 日韩小视频在线观看| www欧美日韩| 亚洲精品一区二区网址| 在线观看日韩欧美| 热久久这里只有精品| 2020欧美日韩在线视频| 日本免费一区二区三区视频观看| 久久久久国产视频| 欧美野外猛男的大粗鳮| 久久免费视频在线观看| 久久99久久99精品免观看粉嫩| 欧美国产亚洲视频| 成人h视频在线| 日韩国产欧美精品在线| 欧美激情精品久久久久久免费印度| 国产精品xxxxx| 国产精品久久久久久久久免费看| 日韩中文字幕网| 国产精品99久久久久久久久久久久| 亚洲精品黄网在线观看| 久久av在线播放| 久久九九有精品国产23| 成人在线精品视频| 在线亚洲欧美视频| 亚洲欧美精品一区| 国内精品中文字幕| 亚洲淫片在线视频| 日韩精品在线视频观看| 欧美国产一区二区三区| 精品动漫一区二区| 国产91在线高潮白浆在线观看| 欧美午夜丰满在线18影院| 国产日韩亚洲欧美| 欧美在线日韩在线| 爽爽爽爽爽爽爽成人免费观看| 国产精品久久久久久久久久| 亚洲欧美制服另类日韩| 久久久久久久久久久网站| 亚洲欧洲中文天堂| 91在线|亚洲| 精品在线观看国产| 精品久久久av| 国产日韩亚洲欧美| 6080yy精品一区二区三区| 欧美色xxxx| 日韩av在线导航| 日本一区二区三区四区视频| 色偷偷9999www| 欧美激情视频一区二区| 7777免费精品视频| 国产亚洲精品久久久久久| 欧美一级电影久久| 国产亚洲精品久久久久久| 国模视频一区二区三区| 亚洲精品xxx| 成人欧美一区二区三区黑人孕妇| 欧美夫妻性生活xx| 亚洲精品xxx| 成人精品一区二区三区电影免费| 久久综合久久88| 欧美一级电影免费在线观看|