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