Day 14 Decorator Part - 2

今天要来介绍 Decorator Factory,它可以让 Decorator 有更多的可能性,撰写的方法是在 Decorator 外面再包裹一层 function,然後 return Decorator,就可以传参数到外面包裹的那层 function,由里面的 Decorator 来接收参数并做更多的事情。

function logger(logMessage: string) {
  return function (constructor: Function) {
    console.log(logMessage)
    console.log(constructor)
  }
}

@logger('someone is logging')
class Person {
  name = 'Claire'

  constructor() {
    console.log('Create person object...')
  }
}

https://ithelp.ithome.com.tw/upload/images/20210929/20131989SI1McPaNU3.png

值得一提的是执行顺序,Decorator 是由下往上执行的,跟 JavaScript 不一样。一样用刚刚的 Decorator Factory 来做示范:

function logger(logMessage: string) {
  return function (constructor: Function) {
    console.log(constructor)
    console.log(logMessage)
  }
}

function signOut(signOutMessage: string) {
  return function (constructor: Function) {
    console.log(signOutMessage)
    console.log(constructor)
  }
}

@signOut('sign out')
@logger('log in')
class Person {
  name = 'Claire'

  constructor() {
    console.log('Create person object...')
  }
}

https://ithelp.ithome.com.tw/upload/images/20210929/20131989GPncPrrPaN.png
这边可以看到是先 console 出了 'log in',才接着 'sign out',所以要特别记得这边的执行顺序跟 JavaScript 是相反的!不过如果是在 Decorator Factory 里面的程序码的话(写在 return 的上方),那顺序就会跟我们习惯的一样是由上而下执行的了。

另外还有一点非常重要的是,Decorator 只会在定义的时候就执行完毕,什麽意思呢?比如说今天在一个 class 前面放了 Decorator,那它在一开始就会执行完毕了,如果後面还有用 class 创造的实例,并不会让 Decorator 再重新执行一次,Decorator 的用意是对原本的 class、函式、参数、属性里面的东西再多做一些事情,至於後面怎麽新增或呼叫等等,都不关它的事了。

今天的学习笔记到这边,谢谢阅读。:)


<<:  【Day 14】Explorer 你怎麽没感觉 - Ring3 Rootkit 隐藏档案

>>:  Day 17. 计算属性(Computed) VS 方法(Methods)

JS 11 - 原型链

大家好! 「链」和「链」的意思不完全相同,但是它们都有环环相扣的概念,在这里是通用的。 我们进入主题...

Day27 跟着官方文件学习Laravel-Request 生命周期

Laravel 文件中有跟我们介绍一个 request 的生命周期,也就是诞生到结束在 Larave...

Day23-你的资料安全吗(一)

前言 就如第一天提到的,资料库可以说是一家公司的命脉,如果资料库不小心被外部攻击者入侵导致资料遗失、...

Day 30:Keep Going 的意思

就这样接连 30 天顺利完成铁人赛系列了~ 为所有自律且成功达标的参赛者们一起喝采!!! 在产出本系...

JS AJAX基础实作(4) DAY29

昨天我们已经将 gotop按钮实做出来 但有时候我们不想要它一直出现 而是使用者滚轮滑到下面 它才会...