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