久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

es6中什么是裝飾器

在es6中,裝飾器(Decorator)是一種與類(class)相關(guān)的語(yǔ)法,用來(lái)注釋或修改類和類方法;裝飾器其實(shí)就是一個(gè)編譯時(shí)執(zhí)行的函數(shù),語(yǔ)法“@函數(shù)名”,通常放在類和類方法的定義前面。裝飾器有兩種:類裝飾器和類方法裝飾器。

es6中什么是裝飾器

本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。

裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個(gè)包裝。

這種模式創(chuàng)建了一個(gè)裝飾類,用來(lái)包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。

ES6 裝飾器

在 ES6 中,裝飾器(Decorator)是一種與類相關(guān)的語(yǔ)法,用來(lái)注釋或修改類和類方法。

裝飾器其實(shí)就是一個(gè)函數(shù),通常放在類和類方法的前面。

裝飾器對(duì)類的行為的改變,是代碼編譯時(shí)發(fā)生的,而不是在運(yùn)行時(shí);裝飾器的本質(zhì)就是編譯時(shí)執(zhí)行的函數(shù)

裝飾器可以用來(lái)裝飾整個(gè)類

@decorateClass class Example {     @decorateMethods     method(){} }

在上面的代碼中使用了兩個(gè)裝飾器,其中 @decorateClass() 裝飾器用在類本身,用于增加或修改類的功能;@decorateMethods() 裝飾器用在類的方法,用于注釋或修改類方法。

兩種類型裝飾器

裝飾器只能用于類和類的方法,不能用于函數(shù),因?yàn)榇嬖诤瘮?shù)提升。

裝飾器只能用于類和類的方法,下面我們分別看下兩種類型的裝飾器的使用

1、類裝飾器

類裝飾器用來(lái)裝飾整個(gè)類

類裝飾器的參數(shù)

target: 類本身,也相當(dāng)于是 類的構(gòu)造函數(shù):Class.prototype.constructor。

@decorateClass class Example {     //... }  function decorateClass(target) {     target.isTestClass = true }

如上面代碼中,裝飾器 @decorateClass 修改了 Example 整個(gè)類的行為,為 Example 類添加了靜態(tài)屬性 isTestClass。裝飾器就是一個(gè)函數(shù),decorateClass 函數(shù)中的參數(shù) target 就是 Example 類本身,也相當(dāng)于是類的構(gòu)造函數(shù) Example.prototype.constructor.

裝飾器傳參

上面實(shí)現(xiàn)的裝飾器在使用時(shí)是不能傳入?yún)?shù)的,如果想要在使用裝飾器是傳入?yún)?shù),可以在裝飾器外面再封裝一層函數(shù)

@decorateClass(true) class Example {     //... }  function decorateClass(isTestClass) {     return function(target) {   target.isTestClass = isTestClass   } }

上面代碼中實(shí)現(xiàn)的裝飾器在使用時(shí)可以傳遞參數(shù),這樣就可以根據(jù)不同的場(chǎng)景來(lái)修改裝飾器的行為。

實(shí)際開(kāi)發(fā)中,React 與 Redux 庫(kù)結(jié)合使用時(shí),常常需要寫成下面這樣。

class MyReactComponent extends React.Component {} export default connect(mapStateToProps, mapDispatchToProps)(MyReactComponent);

有了裝飾器,就可以改寫上面的代碼。

@connect(mapStateToProps, mapDispatchToProps) export default class MyReactComponent extends React.Component {}

2、類方法裝飾器

類方法裝飾器用來(lái)裝飾類的方法

類方法裝飾器的參數(shù)

  • target:

  • 裝飾器修飾的類方法是靜態(tài)方法:target 為類的構(gòu)造函數(shù)

  • 裝飾器修飾的類方法是實(shí)例方法:target 為類的原型對(duì)象

  • method:被修飾的類方法的名稱

  • descriptor:被修飾成員的屬性描述符

// descriptor對(duì)象原來(lái)的值如下 {   value: specifiedFunction,   enumerable: false,   configurable: true,   writable: true };
class Example {     @log     instanceMethod() { }      @log     static staticMethod() { } }  function log(target, methodName, descriptor) {   const oldValue = descriptor.value;    descriptor.value = function() {     console.log(`Calling ${name} with`, arguments);     return oldValue.apply(this, arguments);   };    return descriptor; }

如上面代碼中,裝飾器 @log 分別裝飾了實(shí)例方法 instanceMethod 和 靜態(tài)方法 staticMethod。@log 裝飾器的作用是在執(zhí)行原始的操作之前,執(zhí)行 console.log 來(lái)輸出日志。

類方法裝飾器傳參

上面實(shí)現(xiàn)的裝飾器在使用時(shí)是不能傳入?yún)?shù)的,如果想要在使用裝飾器是傳入?yún)?shù),可以在裝飾器外面再封裝一層函數(shù)

class Example {     @log(1)     instanceMethod() { }      @log(2)     static staticMethod() { } }  function log(id) {     return (target, methodName, descriptor) => {     const oldValue = descriptor.value;      descriptor.value = function() {       console.log(`Calling ${name} with`, arguments, `this id is ${id}`);       return oldValue.apply(this, arguments);     };      return descriptor;   } }

上面代碼中實(shí)現(xiàn)的裝飾器在使用時(shí)可以傳遞參數(shù),這樣就可以根據(jù)不同的場(chǎng)景來(lái)修改裝飾器的行為。

類裝飾器與類方法裝飾器的執(zhí)行順序

如果在一個(gè)類中,同時(shí)使用裝飾器修飾類和類的方法,那么裝飾器的執(zhí)行順序是:先執(zhí)行類方法的裝飾器,再執(zhí)行類裝飾器。

如果同一個(gè)類或同一個(gè)類方法有多個(gè)裝飾器,會(huì)像剝洋蔥一樣,先從外到內(nèi)進(jìn)入,然后由內(nèi)到外執(zhí)行。

// 類裝飾器 function decoratorClass(id){     console.log('decoratorClass evaluated', id);      return (target) => {         // target 類的構(gòu)造函數(shù)         console.log('target 類的構(gòu)造函數(shù):',target)         console.log('decoratorClass executed', id);     } } // 方法裝飾器 function decoratorMethods(id){     console.log('decoratorMethods evaluated', id);     return (target, property, descriptor) => {         // target 代表          // process.nextTick((() => {             target.abc = 123             console.log('method target',target)         // }))         console.log('decoratorMethods executed', id);      } }  @decoratorClass(1) @decoratorClass(2) class Example {     @decoratorMethods(1)     @decoratorMethods(2)     method(){} }  /** 輸入日志 **/ // decoratorMethods evaluated 1 // decoratorMethods evaluated 2 // method target Example { abc: 123 } // decoratorMethods executed 2 // method target Example { abc: 123 } // decoratorMethods executed 1 // decoratorClass evaluated 1 // decoratorClass evaluated 2 // target 類的構(gòu)造函數(shù): [Function: Example] // decoratorClass executed 2 // target 類的構(gòu)造函數(shù): [Function: Example] // decoratorClass executed 1

如上面代碼中,會(huì)先執(zhí)行類方法的裝飾器 @decoratorMethods(1) 和 @decoratorMethods(2),執(zhí)行完后再執(zhí)行類裝飾器 @decoratorClass(1) 和 @decoratorClass(2)

上面代碼中的類方法裝飾器中,外層裝飾器 @decoratorMethods(1) 先進(jìn)入,但是內(nèi)層裝飾器 @decoratorMethods(2) 先執(zhí)行。類裝飾器同理。

利用裝飾器實(shí)現(xiàn)AOP切面編程

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; }  // 日志應(yīng)用 class Maths {     @log     add(a, b) {         return a + b;     } } const math = new Maths(); // passed parameters should get logged now math.add(2, 4);

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
久久人人99| 98精品视频| 欧美精品激情| 老牛影视精品| 中文字幕人成乱码在线观看| 91九色综合| 久久狠狠久久| 国产亚洲精品美女久久| 久久精品97| 国产精品qvod| 精品视频免费| 日韩精品91| 激情久久久久久久| 99pao成人国产永久免费视频 | 日韩欧美中文字幕一区二区三区 | 亚洲精华国产欧美| 视频一区二区三区在线| 日韩一区免费| 久久超级碰碰| 日韩欧美一区二区三区免费观看| 亚洲夜间福利| 亚洲2区在线| 国产欧美一区二区精品久久久 | 日本亚州欧洲精品不卡| 欧美视频二区| 国产一区二区三区四区| 欧美日韩在线观看视频小说| 蜜臀91精品国产高清在线观看| 一区福利视频| 久久精品99久久久| 桃色av一区二区| 亚洲自啪免费| 国产精品4hu.www| 欧美亚洲精品在线| 日本成人在线一区| 国产999精品在线观看| 久久麻豆精品| 91精品国产自产观看在线| 激情综合婷婷| 国产毛片久久| 麻豆国产91在线播放| 亚洲成av在线| 亚洲精品韩国| 麻豆网站免费在线观看| 亚洲欧美日韩国产一区| 国产精品99精品一区二区三区∴| 99久久夜色精品国产亚洲1000部| 亚洲精品成人一区| 国产精品久久久久蜜臀| 久色成人在线| 精品国产欧美日韩一区二区三区| 亚洲成人精选| 国产精品99久久免费观看| 亚洲欧美日韩高清在线| 国产毛片久久久| 自拍日韩欧美| 美女视频网站久久| 伊人成人在线视频| 久久av影院| 亚洲综合精品| 精品视频久久| 首页国产欧美久久| 中文字幕成在线观看| 日韩激情av在线| 久久蜜桃精品| 国产精品入口久久| 羞羞答答国产精品www一本| 精品高清久久| 日韩av一区二区在线影视| 久久中文亚洲字幕| 国产精品17p| 免费看欧美美女黄的网站| 精品资源在线| 日韩三级精品| 亚洲一区免费| 四虎影视精品| 精品伊人久久久| 日韩**一区毛片| 偷拍欧美精品| a国产在线视频| 国产欧美在线观看免费| 亚洲一区日韩在线| 久久久国产精品一区二区中文| 国产伦理一区| 亚洲毛片一区| 国产视频一区欧美| 波多野结衣久久精品| 欧美自拍一区| 视频在线观看一区| 日韩天堂av| 99精品视频精品精品视频| 精品久久影院| 免费看一区二区三区| 日韩精品导航| 美女黄网久久| 精品1区2区3区4区| 蜜臀久久99精品久久一区二区| 神马午夜在线视频| 黄毛片在线观看| 国产一区二区三区不卡av| 国产图片一区| 欧美在线91| 日韩精品第一| 日韩国产在线不卡视频| 麻豆9191精品国产| 久久国产精品99国产| 亚洲特级毛片| 久久视频一区| 欧美日韩免费看片| 日韩一区二区中文| 成人午夜亚洲| 精品国产一区二区三区性色av| 国产伦精品一区二区三区在线播放 | 久久国产中文字幕| 亚洲黄色免费看| 国产一区二区三区探花| 麻豆精品少妇| 国产精品密蕾丝视频下载| 日本va欧美va精品发布| 日韩精品欧美精品| 日韩av中文字幕一区| 欧美天堂在线| 国产精品videossex久久发布| 国产精品99久久免费| 久久丁香四色| 久久精品三级| 鲁鲁在线中文| 亚洲a一区二区三区| 久久免费黄色| 亚洲午夜视频| 国产毛片一区| 日韩欧美精品一区二区综合视频| 日韩精品一区二区三区免费视频| 日韩av资源网| 久久久91麻豆精品国产一区| 久久精品国产福利| 欧美久久天堂| 91高清一区| 色8久久久久| 国产精品一区二区三区www | 在线中文字幕播放| 一区二区三区四区在线看| 欧美午夜精品一区二区三区电影| 五月天久久网站| 亚洲最新av| 国产日产一区| 日韩成人精品一区| 99视频精品全国免费| 亚洲一级在线| 欧美一区久久| 日本不良网站在线观看| 国产精品91一区二区三区| 一二三区精品| 国产精品一级在线观看| 精品国产午夜肉伦伦影院| 欧美日韩尤物久久| 亚洲欧洲一区二区天堂久久| 蜜桃av一区二区三区电影| 日韩国产在线不卡视频| 精品视频一区二区三区四区五区| 亚洲91精品| 日韩精品导航| 美女福利一区二区三区| 在线视频亚洲| 国产亚洲电影| 亚洲www啪成人一区二区| 一区二区三区四区日韩| 老司机免费视频一区二区| 欧美+亚洲+精品+三区| 一本综合精品| 国产aⅴ精品一区二区三区久久 | 久久高清免费| 中文字幕一区日韩精品| 麻豆久久一区| 99精品综合| 亚洲深夜福利在线观看| 国产精品亲子伦av一区二区三区 | 亚洲精品美女| 国产不卡精品在线| 天堂成人国产精品一区| 国产日韩中文在线中文字幕| 日韩.com| 亚洲aa在线| 三级精品视频| 亚洲精品免费观看| 涩涩av在线| 日韩高清在线一区| 日韩精品麻豆| 欧美自拍一区| 久久影院一区| 国产精品传媒麻豆hd| 欧美69视频| 国产精品一级| 99riav国产精品| 麻豆传媒一区二区三区| 国产亚洲综合精品| 麻豆精品在线| 爽爽淫人综合网网站| 91欧美在线| 人人精品久久|