摘要:裝飾器的寫法是在類或類屬性之前,加個(gè)方法名。使用場(chǎng)景突然想到用裝飾器,當(dāng)然是有業(yè)務(wù)需要。但初始化代碼又不歸我控制,且是異步接口請(qǐng)求,不能立即執(zhí)行,這就導(dǎo)致每個(gè)函數(shù)都要調(diào)用一遍這個(gè)方法。
裝飾器簡(jiǎn)介
個(gè)人理解,某些場(chǎng)景需要在不改變?cè)蓄惡蛯傩缘幕A(chǔ)上擴(kuò)展一些功能,所以裝飾器就出現(xiàn)了。
裝飾器的寫法是在類或類屬性之前,加個(gè)方法名。學(xué)過java的同學(xué)應(yīng)該比較熟悉這種寫法,Spring中鋪天蓋地都是注解。具體細(xì)節(jié)到處都是,就不贅述了。
不過截止到今天(2019年8月),遺憾的是nodejs還未原生支持,仍然需要babel編譯。
使用場(chǎng)景突然想到用裝飾器,當(dāng)然是有業(yè)務(wù)需要。寫了一個(gè)api類,所有暴露的函數(shù)都需要進(jìn)行一步初始化操作。但初始化代碼又不歸我控制,且是異步接口請(qǐng)求,不能立即執(zhí)行,這就導(dǎo)致每個(gè)函數(shù)都要調(diào)用一遍這個(gè)init方法。因?yàn)榧恿司彺妫總€(gè)都要判斷有沒有緩存,比較惡心。
常用例子一般用這個(gè)日志模塊來舉例,不過它是同步的
class Math { @log add(a, b) { return a + b; } } function log(target, name, descriptor) { var oldValue = descriptor.value; descriptor.value = function() { console.log(`Calling "${name}" with`, arguments); return oldValue.apply(null, arguments); }; return descriptor; } const math = new Math(); // passed parameters should get logged now math.add(2, 4);修改為異步
let init = 0; class Maths { @log add (a, b) { return a + b + init; } } function log (target, name, descriptor) { let oldValue = descriptor.value; descriptor.value = function (...args) { //有時(shí)候,arguments指向不對(duì),可能是babel的鍋? console.log(`Calling "${name}" with`, args); return new Promise((resolve) => { setTimeout(function () { // args = [...args, 100]; init = 100; resolve(oldValue.apply(target, args)); //this指向 }, 100); }); }; return descriptor; } const math = new Maths(); (async () => { let a = await math.add(2, 4); console.log(a); })();
在具體函數(shù)前加了裝飾器后,會(huì)先執(zhí)行log方法,這樣緩存的變量就修改了。雖然結(jié)果變成異步的,但也滿足我的需要了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106570.html
摘要:本套課程包含兩大部分,第一部分是基礎(chǔ)部分,也是重要部分,參考官方文檔結(jié)構(gòu),針對(duì)內(nèi)容之間的關(guān)聯(lián)性和前后順序進(jìn)行合理調(diào)整。 showImg(https://segmentfault.com/img/bVbpBA0?w=1460&h=400); 講師簡(jiǎn)介: iview 核心開發(fā)者,iview-admin 作者,百萬級(jí)虛擬渲染表格組件 vue-bigdata-table 作者。目前就職于知名互...
摘要:第二部分源碼解析接下是應(yīng)用多個(gè)第二部分對(duì)于一個(gè)方法應(yīng)用了多個(gè),比如會(huì)編譯為在第二部分的源碼中,執(zhí)行了和操作,由此我們也可以發(fā)現(xiàn),如果同一個(gè)方法有多個(gè)裝飾器,會(huì)由內(nèi)向外執(zhí)行。有了裝飾器,就可以改寫上面的代碼。 Decorator 裝飾器主要用于: 裝飾類 裝飾方法或?qū)傩? 裝飾類 @annotation class MyClass { } function annotation(ta...
摘要:的裝飾器中的同樣借鑒了這個(gè)語法糖,不過依賴于的方法。等同于也就是說,裝飾器是一個(gè)對(duì)類進(jìn)行處理的函數(shù)。別名或裝飾器在控制臺(tái)顯示一條警告,表示該方法將廢除。有了裝飾器,就可以改寫上面的代碼。 更多文章,請(qǐng)?jiān)贕ithub blog查看 在 ES6 中增加了對(duì)類對(duì)象的相關(guān)定義和操作(比如 class 和 extends ),這就使得我們?cè)诙鄠€(gè)不同類之間共享或者擴(kuò)展一些方法或者行為的時(shí)候,變得并...
摘要:什么是裝飾器模式向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)的設(shè)計(jì)模式被稱為裝飾器模式,它是作為現(xiàn)有的類的一個(gè)包裝。中的裝飾器模式中有一個(gè)的提案,使用一個(gè)以開頭的函數(shù)對(duì)中的及其屬性方法進(jìn)行修飾。 1 什么是裝飾器模式 showImg(https://segmentfault.com/img/remote/1460000015970102?w=1127&h=563); 向一個(gè)現(xiàn)有的對(duì)...
閱讀 834·2021-09-22 15:18
閱讀 1185·2021-09-09 09:33
閱讀 2759·2019-08-30 10:56
閱讀 1194·2019-08-29 16:30
閱讀 1493·2019-08-29 13:02
閱讀 1463·2019-08-26 13:55
閱讀 1648·2019-08-26 13:41
閱讀 1945·2019-08-26 11:56