最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文讀懂ES7中的javascript修飾器

 更新時(shí)間:2019年05月06日 10:41:57   作者:會(huì)說話的魚  
這篇文章主要給大家介紹了關(guān)于ES7中javascript修飾器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用ES7具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

什么是修飾器

修飾器(Decorator)是ES7的一個(gè)提案,它的出現(xiàn)能解決兩個(gè)問題:

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

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

以上的兩個(gè)用處可能不太明白,沒關(guān)系,我們開始第一個(gè)例子

例子1:修飾類

@setProp
class User {}

function setProp(target) {
 target.age = 30
}

console.log(User.age)

這個(gè)例子要表達(dá)的是對User類使用setProp這個(gè)方法進(jìn)行修飾,用來增加User類中age的屬性,setProp方法會(huì)接收3個(gè)參數(shù),我們現(xiàn)在接觸第一個(gè),target代表User類本身。

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

@setProp(20)
class User {}

function setProp(value) {
 return function (target) {
  target.age = value
 }
}

console.log(User.age)

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

例子2:修飾方法

class User {
 @readonly
 getName() {
  return 'Hello World'
 }
}

// readonly修飾函數(shù),對方法進(jìn)行只讀操作
function readonly(target, name, descriptor) {
 descriptor.writable = false
 return descriptor
}

let u = new User()
// 嘗試修改函數(shù),在控制臺(tái)會(huì)報(bào)錯(cuò)
u.getName = () => {
 return 'I will override'
}

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

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

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

那么,輸出就是Hello World了,而是Hello decorator,是不是已經(jīng)意識(shí)到修飾器的好處了?,F(xiàn)在我們來看看實(shí)際工作中,我們用到修飾器的例子

實(shí)際應(yīng)用1:日志管理

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

class Pack {
 @log('讀取package.json文件')
 step1() {
  // do something...
  // 沒有修飾器之前,我們通常把console.log放到這里寫
  // 放到函數(shù)里面寫會(huì)有兩個(gè)壞處
  //  1.console和業(yè)務(wù)無關(guān),會(huì)破壞函數(shù)單一性原則
  //  2.如果要?jiǎng)h除所有的console,那我們只能深入到每一個(gè)方法中
 }
 @log('合并webpack配置文件')
 step2() {
  // do something...
 }
}

function log(value) {
 return function (target, name, descriptor) {
  // 在這里,我們還可以拿到函數(shù)的參數(shù),打印更加詳細(xì)的信息
  console.log(value)
 }
}

let pack = new Pack()
pack.step1()
pack.step2()

實(shí)際應(yīng)用2:檢查登錄

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

class User {
 // 獲取已登錄用戶的用戶信息
 @checkLogin
 getUserInfo() {
  /**
   * 之前,我們都會(huì)這么寫:
   *  if(checkLogin()) {
   *   // 業(yè)務(wù)代碼
   *  }
   * 這段代碼會(huì)在每一個(gè)需要登錄的方法中執(zhí)行
   * 還是上面的問題,執(zhí)行的前提和業(yè)務(wù)又混到了一起
   */
  console.log('獲取已登錄用戶的用戶信息')
 }
 // 發(fā)送消息
 @checkLogin
 sendMsg() {
  console.log('發(fā)送消息')
 }
}

// 檢查用戶是否登錄,如果沒有登錄,就跳轉(zhuǎn)到登錄頁面
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('沒有登錄,即將跳轉(zhuǎn)到登錄頁面...')
  }
 }
}
let u = new User()
u.getUserInfo()
u.sendMsg()

結(jié)語

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

源碼以及使用方法,請移步GitHub本地下載

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • jQuery獲取隨機(jī)顏色的實(shí)例代碼

    jQuery獲取隨機(jī)顏色的實(shí)例代碼

    這篇文章主要介紹了jQuery獲取隨機(jī)顏色的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編來學(xué)習(xí)吧
    2018-05-05
  • JavaScript中匿名函數(shù)用法實(shí)例

    JavaScript中匿名函數(shù)用法實(shí)例

    這篇文章主要介紹了JavaScript中匿名函數(shù)用法,實(shí)例分析了javascript中匿名函數(shù)的功能、定義及具體用法,需要的朋友可以參考下
    2015-03-03
  • 沒有document.getElementByName方法

    沒有document.getElementByName方法

    document.getElementByName方法沒有document.getElementsByName得到的是標(biāo)簽的數(shù)組,下面為大家詳細(xì)介紹下具體的使用,感興趣的朋友可以參考下,希望對大家有所幫助
    2013-08-08
  • 詳解用場景去理解函數(shù)柯里化(入門篇)

    詳解用場景去理解函數(shù)柯里化(入門篇)

    這篇文章主要介紹了用場景去理解函數(shù)柯里化(入門篇),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼

    Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼

    這篇文章主要介紹了Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼,可實(shí)現(xiàn)圓圈的旋轉(zhuǎn)與運(yùn)動(dòng)效果,涉及javascript動(dòng)態(tài)操作頁面元素屬性及進(jìn)行相應(yīng)數(shù)學(xué)運(yùn)算的技巧,需要的朋友可以參考下
    2015-08-08
  • 微信小程序如何獲取用戶收貨地址

    微信小程序如何獲取用戶收貨地址

    這篇文章主要為大家詳細(xì)介紹了微信小程序獲取用戶收貨地址的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 微信小程序轉(zhuǎn)發(fā)事件實(shí)現(xiàn)解析

    微信小程序轉(zhuǎn)發(fā)事件實(shí)現(xiàn)解析

    這篇文章主要介紹了微信小程序轉(zhuǎn)發(fā)事件實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • JS對文本框值的判斷示例

    JS對文本框值的判斷示例

    JS判斷只能是數(shù)字和小數(shù)點(diǎn),下面為大家介紹下使用JS對文本框值的判斷,需要的朋友可以參考下
    2014-03-03
  • JavaScript 正則應(yīng)用詳解【模式、欲查、反向引用等】

    JavaScript 正則應(yīng)用詳解【模式、欲查、反向引用等】

    這篇文章主要介紹了JavaScript 正則應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript 正則表達(dá)式模式、欲查、反向引用等相關(guān)概念、原理與操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • 在vs2010中調(diào)試javascript代碼方法

    在vs2010中調(diào)試javascript代碼方法

    只在IE瀏覽器中測試成功了,在谷歌瀏覽中沒有測試成功,其他瀏覽器沒有測試。
    2011-02-02

最新評論

余江县| 天等县| 民和| 仲巴县| 鹤庆县| 仲巴县| 竹山县| 兖州市| 新安县| 义马市| 利津县| 临夏市| 罗定市| 湘乡市| 日土县| 灌南县| 凤翔县| 大田县| 合作市| 拉萨市| 景洪市| 碌曲县| 北安市| 兰溪市| 尉氏县| 万山特区| 朔州市| 上饶县| 江门市| 噶尔县| 饶平县| 宜章县| 正宁县| 常州市| 商都县| 甘德县| 忻城县| 株洲市| 长宁县| 延津县| 屯留县|