日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

5分鐘帶你了解【前端裝飾器】,“高大上”的“基礎知識”

來源: 責編: 時間:2024-05-08 09:20:36 228觀看
導讀前言大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心。基本介紹裝飾器是一種以 @ 符號開頭的特殊語法,放在目標代碼的前面用于包裝或擴展代碼功能。JavaScript 的裝飾器語法目

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心。opX28資訊網——每日最新資訊28at.com

基本介紹

裝飾器是一種以 @ 符號開頭的特殊語法,放在目標代碼的前面用于包裝或擴展代碼功能。JavaScript 的裝飾器語法目前仍處于提案階段,現階段使用的話需要通過 bable 等方式進行編譯之后,才能在瀏覽器正常運行。裝飾器分為兩種:類裝飾器,類成員裝飾器,分別用于裝飾我們的類以及類的成員。opX28資訊網——每日最新資訊28at.com

基本使用(類裝飾器)

class MyClass {  constructor() {}}

比如現在有一個類或者函數 MyClass,它的身上沒有任何的東西,但是我想要給他加一個 log 方法,那我們應該怎么做呢?很多人回想說,直接在它身上加一個 log 方法即可~opX28資訊網——每日最新資訊28at.com

class MyClass {  constructor() {}    log() {}}

但是這么做的話,一個 class 是能做,那如果要給 1000 個 class 加上 log方法呢?那豈不是每一個都得寫~很麻煩,這個時候可以使用 裝飾器 去拓展每一個 classopX28資訊網——每日最新資訊28at.com

  • 可以拓展原型方法
  • 可以拓展靜態屬性

裝飾器接收的參數是裝飾的目標類,這里的 cls 就是 MyClassopX28資訊網——每日最新資訊28at.com

function addConcole(target) {  // 拓展原型方法  target.prototype.log = function(msg) {    console.log(`[${new Date()} ${msg}`);  };  // 拓展靜態屬性  target.myName = '一個類'  return target;}@addConcoleclass MyClass {  constructor() {}}const myObj = new MyClass();myObj.log('林三心');// [Sat Jul 08 2023 17:31:55 GMT+0800 (中國標準時間) 林三心console.log(MyClass.myName)// 一個類

應用場景

Node路由請求Url(類成員裝飾器)

我們在使用一些 Node 的框架時,在寫接口的時候,我們可能會經常看到這樣的代碼opX28資訊網——每日最新資訊28at.com

  • 當我們請求路徑是 GET doc 時會匹配到findDocById
  • 當我們請求路徑是 POST doc 時會匹配到createDoc
class Doc {  @Get('doc')  async findDocById(id) {}    @Post('doc')  async createDoc(data) {}}

其實這個 @Get 和 @Post ,是框架提供給我們的 類成員裝飾器,是的,類成員也能使用裝飾器,類成員裝飾器接收三個參數:opX28資訊網——每日最新資訊28at.com

  • target 是目標類的原型對象
  • key 表示目標類成員的鍵名
  • descriptor 是一個屬性描述符對象,它包含目標類成員的屬性特性(例如 value、writable 等)
function Get(path) {  return function(target, key, descriptor) {    console.log({      target,      key,      descriptor    })  }}

圖片圖片opX28資訊網——每日最新資訊28at.com

他的基本實現原理大概是這樣的opX28資訊網——每日最新資訊28at.com

function Get(routePath) {  return function(target, key, descriptor) {    const originalMethod = descriptor.value; // 保存原始方法    descriptor.value = function() {      // 在原始方法執行前加入邏輯      console.log('處理 Get 請求,路由路徑: ' + routePath);      // 執行原始方法      const result = originalMethod.apply(this, arguments);      // 在原始方法執行后加入邏輯      console.log('Get 請求處理完成');      return result;    };    return descriptor;  };}

接口權限控制(類成員裝飾器疊加)

上面我們介紹了一下 Nodejs Url 的路由匹配基本原理,但是這是不夠的,因為很多接口還需要權限控制,比如:opX28資訊網——每日最新資訊28at.com

  • GET doc 接口只能 管理員 才能訪問
  • POST doc 接口只能 超級管理員 才能訪問

這也可以用裝飾器來實現,并且裝飾器是可以疊加的~opX28資訊網——每日最新資訊28at.com

class Doc {  @Get('doc')  @Role('admin')  async findDocById(id) {}    @Post('doc')  @Role('superAdmin')  async createDoc(data) {}}

裝飾器疊加的執行順序是 從下往上 的~我們可以看一下下面的例子,發現輸出順序是opX28資訊網——每日最新資訊28at.com

  • 2
  • 1
function A () {  console.log(1)}function B () {  console.log(2)}class Doc {  @A  @B  async test() {}}

至于權限控制的裝飾器實現,需要根據不同業務去實現,我這里就粗略實現一下opX28資訊網——每日最新資訊28at.com

function Role(permissions) {  return function(target, key, descriptor) {    const originalMethod = descriptor.value; // 保存原始方法    descriptor.value = function() {      // 在原始方法執行前進行權限驗證      const user = getCurrentUser(); // 獲取當前用戶信息      // 檢查用戶是否擁有所需權限      const hasPermission = checkUserPermissions(user, permissions);      if (!hasPermission) {        // 如果用戶沒有權限,則拋出錯誤或執行其他處理        throw new Error('無權限訪問該接口');      }      // 執行原始方法      const result = originalMethod.apply(this, arguments);      return result;    };    return descriptor;  };}

記錄日志的裝飾器

我們想要在執行某個函數的時候,記錄一下opX28資訊網——每日最新資訊28at.com

  • 函數調用時間
  • 函數調用參數

這個時候我們也可以使用裝飾器來完成,非常方便!!!opX28資訊網——每日最新資訊28at.com

// 日志裝飾器函數function logDecorator(target, key, descriptor) {  const originalMethod = descriptor.value; // 保存原始方法  descriptor.value = function(...args) {    console.log(`調用函數:${key}`);    console.log(`參數:${JSON.stringify(args)}`);    // 執行原始方法    const result = originalMethod.apply(this, args);    console.log(`返回值:${result}`);    return result;  };  return descriptor;}// 示例類class Example {  @logDecorator  greet(name) {    return `Hello, ${name}!`;  }}// 測試const example = new Example();example.greet('林三心');

緩存的裝飾器

如果我們執行一個方法,獲取返回值需要經過一系列的計算,非常耗時間,那么我們可以判斷入參,第一次時計算完緩存起來,第二次的時候如果還是這個入參,就直接從緩存中去拿,這個操作也可以使用裝飾器去完成opX28資訊網——每日最新資訊28at.com

// 緩存裝飾器函數function cacheDecorator(target, key, descriptor) {  const cache = {}; // 緩存對象  const originalMethod = descriptor.value; // 保存原始方法  descriptor.value = function(...args) {    const cacheKey = JSON.stringify(args); // 生成緩存鍵    if (cacheKey in cache) {      console.log('從緩存中獲取結果');      return cache[cacheKey]; // 直接返回緩存結果    }    // 執行原始方法    const result = originalMethod.apply(this, args);    console.log('將結果緩存起來');    cache[cacheKey] = result; // 緩存結果    return result;  };  return descriptor;}// 示例類class Example {  @cacheDecorator  getValue(key) {    console.log('執行函數邏輯');    return key + Math.random(); // 模擬復雜的計算邏輯  }}// 測試const example = new Example();console.log(example.getValue('foo'));console.log(example.getValue('foo')); // 從緩存中獲取結果

防抖節流的裝飾器

對于防抖節流,我們平時可能會這么去做opX28資訊網——每日最新資訊28at.com

class C {  onClick = debounce(fn, 100)}

但是這么做的話會使這個函數不好拓展,所以使用裝飾器真的很方便opX28資訊網——每日最新資訊28at.com

// 防抖裝飾器function debounce(time) {  return function (target, key, descriptor) {    const oldFunction = descriptor.value;    let timer = null;    descriptor.value = function () {      clearTimeout(timer);      timer = setTimeout(() => {        oldFunction.apply(this, arguments)      }, time);    };    return descriptor;  }}// 節流裝飾器function throttle(time) {  return function (target, key, descriptor) {    const oldFunction = descriptor.value;    let isLock = false;    descriptor.value = function() {      if(isLock) { return; }      isLock = true;      oldFunction.apply(this, arguments);      setTimeout(() => {        isLock = false;       }, time);    }    return descriptor;  }}class C {  @debounce(1000)  onClick() {}    @throttle(1000)  onScroll() {}}


opX28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-87263-0.html5分鐘帶你了解【前端裝飾器】,“高大上”的“基礎知識”

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 關于 CSS 選擇器權重,99% 的人都理解錯了!

下一篇: 為什么要看 Python 源碼?它的結構長什么樣子?

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業務的發展,組織規模的擴大,越來越多的企業開始意識到協作效率對于企業團隊的重要性,甚至是決定其在某個行業競爭中突圍的關鍵,是企業長久生存的根本。得物
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之“想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!”曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 騰訊VS網易,最卷游戲暑期檔,誰能笑到最后?

    作者:無銹缽來源:財經無忌7月16日晚,上海1862時尚藝術中心。伴隨著幻象的精準命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰隊以絕對的優勢戰勝了BLG戰隊,拿下了總決
  • 造車兩年股價跌六成,小米的估值邏輯變了嗎?

    如果從小米官宣造車后的首個交易日起持有小米集團的股票,那么截至2023年上半年最后一個交易日,投資者將浮虧59.16%,同區間的恒生科技指數跌幅為52.78%
  • Windows 11發布,微軟一改往常對老機型開放的態度

    距離 Windows 11 發布已經過去一周,在過去一周里,很多數碼愛好者圍繞其對 Android 應用的支持、對老機型的升級問題展開了激烈討論。與以往不同的是,在這次大
  • 蘋果140W USB-C充電器:采用氮化鎵技術

    據10 月 30 日 9to5 Mac 消息報道,當蘋果推出新的 MacBook Pro 2021 時,該公司還推出了新的 140W USB-C 充電器,附贈在 MacBook Pro 16 英寸機型的盒子里,也支
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
  • 中關村論壇11月25日開幕,15位諾獎級大咖將發表演講

    11月18日,記者從2022中關村論壇新聞發布會上獲悉,中關村論壇將于11月25至30日在京舉行。本屆中關村論壇由科學技術部、國家發展改革委、工業和信息化部、國務
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美日韩黄视频| 欧美电影免费观看大全| 日韩视频一区二区| 一本久道久久久| 亚洲一区二区三区高清| 午夜久久久久| 久久综合九色综合欧美就去吻| 麻豆91精品91久久久的内涵| 免费成人高清| 欧美午夜精品久久久| 一二三四社区欧美黄| 亚洲一区二区三区四区视频| 欧美亚洲一区三区| 欧美成人久久| 国产精品网站在线| 亚洲电影免费观看高清完整版在线观看| 亚洲三级免费观看| 亚洲欧美三级在线| 免费在线一区二区| 久久久久久**毛片大全| 欧美一区二区三区婷婷月色| 麻豆freexxxx性91精品| 欧美偷拍另类| 国产精品成人免费精品自在线观看| 国产美女精品视频| 亚洲日本电影在线| 午夜精品成人在线视频| 欧美h视频在线| 国产精品一区在线观看| 亚洲精品乱码久久久久久久久| 亚洲嫩草精品久久| 欧美成人中文| 国产美女精品| 国产一区 二区 三区一级| 亚洲欧洲另类| 欧美一区亚洲一区| 欧美日韩裸体免费视频| 加勒比av一区二区| 亚洲午夜免费视频| 蜜臀久久久99精品久久久久久| 国产精品久久久久久久久搜平片| 1024亚洲| 亚洲美女91| 久久精品官网| 国产精品久久久久久久久久妞妞| 国产精品视频一区二区三区| 亚洲福利专区| 亚洲精品日韩在线| 久久久久女教师免费一区| 欧美香蕉大胸在线视频观看| 亚洲大胆av| 欧美自拍丝袜亚洲| 国产精品v欧美精品∨日韩| 国产精品网曝门| 亚洲精品一区二区三区99| 久久精品免费观看| 国产精品一卡二卡| 亚洲视频二区| 欧美日本一区二区三区| 国产精品免费视频xxxx| 国内久久婷婷综合| 亚洲欧美日本日韩| 久久久久久亚洲精品杨幂换脸 | 欧美一区二区三区四区在线| 欧美日韩成人综合| 亚洲国产精品一区二区久| 久久久99久久精品女同性| 国产精品羞羞答答xxdd| 中文在线资源观看视频网站免费不卡| 欧美88av| 国产婷婷一区二区| 亚洲国产欧美一区二区三区久久| 久久国产视频网站| 国产情侣久久| 亚洲裸体俱乐部裸体舞表演av| 久久久人人人| 国内精品久久久久影院薰衣草| 欧美一区=区| 国产精品一区二区三区免费观看| 在线性视频日韩欧美| 欧美日韩国产综合一区二区| 国产欧美在线视频| 午夜欧美大片免费观看| 国产精品日韩在线| 亚洲女爱视频在线| 男同欧美伦乱| 亚洲高清一区二| 蜜臀久久久99精品久久久久久| 在线成人av网站| 久久综合色播五月| 亚洲国产成人精品女人久久久| 另类春色校园亚洲| 一片黄亚洲嫩模| 欧美偷拍一区二区| 亚洲一区免费在线观看| 国产精品久久午夜| 欧美一区二区三区婷婷月色| 狠狠狠色丁香婷婷综合激情| 老司机67194精品线观看| 亚洲国产精品成人一区二区| 欧美黄色影院| 亚洲视频在线免费观看| 国产精品一卡| 久久国产婷婷国产香蕉| 在线免费观看日韩欧美| 欧美电影免费观看| 一区二区三区鲁丝不卡| 国产精品亚洲综合色区韩国| 久久精品亚洲乱码伦伦中文| 伊人婷婷欧美激情| 欧美极品影院| 亚洲欧美日本日韩| 国内视频一区| 欧美激情成人在线视频| 亚洲先锋成人| 韩国三级在线一区| 欧美激情免费观看| 亚洲一二三四区| 国产丝袜一区二区| 欧美a一区二区| 一区二区国产精品| 国产偷自视频区视频一区二区| 久久野战av| 一本大道av伊人久久综合| 国产精品视频一二| 免费成人黄色av| 亚洲天堂男人| 国产主播一区| 欧美人与禽性xxxxx杂性| 亚洲高清av在线| 欧美香蕉大胸在线视频观看| 久久九九久精品国产免费直播| 亚洲激情视频网| 国产精品福利在线| 久久久激情视频| 99视频在线精品国自产拍免费观看| 欧美天堂亚洲电影院在线播放| 久久国产精品一区二区三区| 亚洲三级色网| 国产亚洲欧美日韩日本| 欧美精品乱人伦久久久久久 | 在线精品视频一区二区三四| 欧美日韩视频不卡| 欧美一区二区三区久久精品茉莉花 | 免播放器亚洲一区| 亚洲一区二区三区中文字幕 | 亚洲国产成人精品久久| 国产精品久久国产三级国电话系列| 久久九九国产精品| 宅男噜噜噜66一区二区| 黄色小说综合网站| 国产精品qvod| 欧美成人一区二区三区在线观看| 亚洲欧洲av一区二区| 亚洲人精品午夜在线观看| 国产日本亚洲高清| 欧美日韩视频一区二区三区| 亚洲欧美日韩直播| aa日韩免费精品视频一| 伊人婷婷久久| 国产情人节一区| 欧美日韩日本网| 亚洲一区日韩| 亚洲黄页一区| 国产精品va在线| 久久亚洲一区| 亚洲精品日韩在线| 国产一区二区中文| 毛片一区二区| 欧美亚洲系列| 亚洲天堂成人在线视频| 亚洲欧洲综合另类| 樱花yy私人影院亚洲| 国产日韩精品在线播放| 欧美视频一区二区三区在线观看| 欧美jjzz| 玖玖玖国产精品| 久久精品噜噜噜成人av农村| 亚洲国产精品va在线看黑人动漫| 国产伦精品一区二区三区视频孕妇| 欧美日韩精品福利| 欧美国产91| 免费在线观看精品| 久久免费视频网| 久久爱www久久做| 午夜一区二区三区在线观看| 99视频一区| 一本久久综合| 日韩视频不卡中文| 亚洲精品1区2区| 亚洲国产精品成人精品| 樱花yy私人影院亚洲| 国产亚洲欧美色| 欧美美女喷水视频| 欧美国产激情二区三区| 牛人盗摄一区二区三区视频| 久久久亚洲影院你懂的| 久久精品一区二区三区四区 | 国产婷婷成人久久av免费高清| 国产精品自在在线| 国产精品网红福利| 国产欧美91| 国产欧美精品一区二区色综合| 国产精品午夜av在线|