從擼貓到 AOP 的思考躁倒,程序員的大腦究竟在想什么

最近從朋友那邊白嫖了一只貓,說起這個擼貓洒琢,真是不得了秧秉,太有癮了,擼起來就停不下來衰抑,這可愛的小家伙喵喵喵的象迎,甄氏萌翻了。早上喂了早飯停士,鏟了屎就去上班了挖帘。

中午 12:00,我開始躁動不安了恋技,我家貓咋樣了,是不是餓著了逻族,是不是渴了蜻底。有沒有拆我家電視,有沒有撓我的沙發(fā),不行了薄辅,awsl要拂,我要知道我家貓在干啥。

  1. 我想知道我家貓在干啥
  2. 我不想打擾我家貓正常的生活

這不就是 AOP 嘛站楚,剛好最近正好工作有用到了 AOP脱惰,那我們不得不說一下什么是 AOP?

Aspect-oriented programming

面向切面編程窿春,旨在通過允許跨領(lǐng)域關(guān)注點的分離來提高模塊化拉一。通常呢是通過不修改代碼本身的情況下向現(xiàn)有代碼添加其他行為,目標(biāo)是一個切入點旧乞,切面蔚润,所以也就有了面向切面編程這個說法。值得一提的是尺栖,AOP 是一種編程規(guī)范嫡纠,并不是一種純粹的技術(shù),她只提供了定義延赌,具體實現(xiàn)還是有很多種的除盏,比較常見的就是裝飾器的形式。

function business() {
  console.log('I will do some business!');
}
async function asyncBusiness() {
  await new Promise(resolve => setTimeout(() => resolve('ohhhhhhhhhh'), 3000));
  console.log('I will do some async business!');
}

function monitor(callback) {
  return async function() {
    console.log('monitor start');
    const result = await callback.apply(this, arguments);
    console.log('monitor end');
    return result;
  };
}

const monitorBusiness = monitor(business);
const monitorAsyncBusiness = monitor(asyncBusiness);

business();
monitorBusiness();
await asyncBusiness();
await monitorAsyncBusiness();

其實一個裝飾器就是這么簡單挫以,那么我們常見的@的形式來實現(xiàn)的裝飾器是什么樣的呢者蠕?@形式的裝飾器其實是利用了 Object.defineProperty。

Object.defineProperty

Object.defineProperty(obj, prop, descriptor) obj The object on which to define the property. prop The name or Symbol of the property to be defined or modified. descriptor The descriptor for the property being defined or modified.

詳細的內(nèi)容不在本期講解屡贺,如果有興趣蠢棱,請關(guān)注我們的公眾號 ihap 技術(shù)黑洞 ,之后我才會告訴你在 MDN 的鏈接是

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

不關(guān)注的你們就不知道了甩栈!

decorator

回到我們的裝飾器上泻仙,那么怎么寫一個在類里可以使用的裝飾器呢?

ok, 逼格 than 逼格量没,讓我們優(yōu)雅的在代碼里逼格一下玉转!

class WatchCat {
  @log
  eat() {
    console.log('cat is eatting');
  }

  @log
  drink() {
    console.log('cat is drink');
  }
}

function log(target) {
  if (target.kind === 'method') {
    const original = target.descriptor.value;
    target.descriptor = {
      ...target.descriptor,
      async value(...args) {
        try {
          console.log('I am watching my cat!');
          const result = await original.apply(this, args);
          console.log('I am finished watch my cat!');
          return result;
        } catch (err) {
          console.error('sorry, my cat broken my monitor');
          throw err;
        }
      },
    };
  }

  return target;
}

const watchCat = new WatchCat();
watchCat.eat();
代碼演示圖

這樣,在我們對貓進行觀察的時候殴蹄,貓并沒有產(chǎn)生什么反應(yīng)究抓,還是在吃飯。

好了袭灯,我決定買個攝像頭來監(jiān)視我的貓每天究竟在干嘛

實際上它每天我不在的時候就在吃睡刺下,怪不得每天晚上都是這么精神。

好了稽荧,本次的肥少帶你擼貓之旅就到此結(jié)束了橘茉。不說了,問問客服能不能退貨,攝像頭完全沒有意義了畅卓。

自此感謝我們 ihap 技術(shù)黑洞 的鎮(zhèn)號之寵——芝麻擅腰!友情出演。

你們是不是以為沒了翁潘?哈哈哈哈哈哈哈趁冈,突然想起來忘記給你們講@log('ihap 技術(shù)黑洞')如果有參數(shù)的形式,要怎么寫了拜马。

function log(name) {
  return target => {
    if (target.kind === 'method') {
      const original = target.descriptor.value;
      target.descriptor = {
        ...target.descriptor,
        async value(...args) {
          try {
            console.log(`${name} is watching my cat!`);
            const result = await original.apply(this, args);
            console.log(`${name} is finished watch my cat!`);
            return result;
          } catch (err) {
            console.error('sorry, my cat broken my monitor');
            throw err;
          }
        },
      };
    }

    return target;
  };
}
代碼演示圖

好了渗勘,真的沒有了,大家白白!

參考文獻:
https://stackoverflow.com/questions/8112111/is-aop-a-type-of-decorator-pattern
https://www.sitepoint.com/javascript-decorators-what-they-are/
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末一膨,一起剝皮案震驚了整個濱河市呀邢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豹绪,老刑警劉巖价淌,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞒津,居然都是意外死亡蝉衣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門巷蚪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來病毡,“玉大人,你說我怎么就攤上這事屁柏±材ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵淌喻,是天一觀的道長僧家。 經(jīng)常有香客問我,道長裸删,這世上最難降的妖魔是什么八拱? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮涯塔,結(jié)果婚禮上肌稻,老公的妹妹穿的比我還像新娘。我一直安慰自己匕荸,他們只是感情好爹谭,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榛搔,像睡著了一般旦棉。 火紅的嫁衣襯著肌膚如雪齿风。 梳的紋絲不亂的頭發(fā)上药薯,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天绑洛,我揣著相機與錄音,去河邊找鬼童本。 笑死真屯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的穷娱。 我是一名探鬼主播绑蔫,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泵额!你這毒婦竟也來了配深?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嫁盲,失蹤者是張志新(化名)和其女友劉穎篓叶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羞秤,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡缸托,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘾蛋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俐镐。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哺哼,靈堂內(nèi)的尸體忽然破棺而出佩抹,到底是詐尸還是另有隱情,我是刑警寧澤取董,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布棍苹,位于F島的核電站,受9級特大地震影響甲葬,放射性物質(zhì)發(fā)生泄漏廊勃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一经窖、第九天 我趴在偏房一處隱蔽的房頂上張望坡垫。 院中可真熱鬧,春花似錦画侣、人聲如沸冰悠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溉卓。三九已至皮迟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桑寨,已是汗流浹背伏尼。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尉尾,地道東北人爆阶。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像沙咏,于是被迫代替她去往敵國和親辨图。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容