真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javascript修飾器有什么用

這篇文章主要講解了“javascript修飾器有什么用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“javascript修飾器有什么用”吧!

創(chuàng)新互聯(lián)建站主營(yíng)隆回網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,手機(jī)APP定制開(kāi)發(fā),隆回h5微信小程序定制開(kāi)發(fā)搭建,隆回網(wǎng)站營(yíng)銷(xiāo)推廣歡迎隆回等地區(qū)企業(yè)咨詢(xún)

什么是修飾器

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

  • 不同類(lèi)間共享方法

  • 編譯期對(duì)類(lèi)和方法的行為進(jìn)行改變

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

javascript修飾器有什么用

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

例子1:修飾類(lèi)

@setProp
class User {}

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

console.log(User.age)

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

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

@setProp(20)
class User {}

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

console.log(User.age)

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

例子2:修飾方法

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

// readonly修飾函數(shù),對(duì)方法進(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'
}

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

javascript修飾器有什么用

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

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

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

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

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

class Pack {
 @log('讀取package.json文件')
 step1() {
  // do something...
  // 沒(méi)有修飾器之前,我們通常把console.log放到這里寫(xiě)
  // 放到函數(shù)里面寫(xiě)會(huì)有兩個(gè)壞處
  //  1.console和業(yè)務(wù)無(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í)際的開(kāi)發(fā)中常用得到,我們一些操作前,必須得判斷用戶是否登錄,比較點(diǎn)贊、結(jié)算、發(fā)送彈幕...按照之前的寫(xiě)法,我們必須在每一個(gè)方法中判斷用戶的登錄情況,然后再進(jìn)行業(yè)務(wù)的操作,很顯然前置條件和業(yè)務(wù)又混到了一起,用修飾器,就可以完美的解決這一問(wèn)題,代碼如下:

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

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

感謝各位的閱讀,以上就是“javascript修飾器有什么用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)javascript修飾器有什么用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


分享名稱(chēng):javascript修飾器有什么用
網(wǎng)站鏈接:http://weahome.cn/article/jpheji.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部