裝飾器模式

什么是裝飾器模式

ES6/ES7中的裝飾器模式簡(jiǎn)而言之就是對(duì)現(xiàn)有類進(jìn)行一個(gè)包裝徒蟆,不通過子類或者改變其內(nèi)部結(jié)構(gòu)的方式為其擴(kuò)展功能鬼贱。

通俗的說,就是將現(xiàn)有的類變得更加“華麗”硕勿,比如禮物可以直接送鄙早,但是加上禮品盒更美觀弄慰,手機(jī)可以直接用,但是加上鋼化膜更耐摔蝶锋。以“吃雞”游戲?yàn)槔?8k本身就具有狙擊功能陆爽。安裝狙消音可以槍具有消音功能,8倍鏡可以擴(kuò)大視野范圍扳缕,槍托可以增加強(qiáng)的穩(wěn)定性慌闭,這些都沒有改變?cè)械?8k可以狙擊的功能,只是讓它的屬性變得更強(qiáng)躯舔。

裝飾器的行為可以理解為如下:

@decorator

class A{ }

//? 等同于

class A = { }

A = decorator(A) || A;

裝飾器的本質(zhì)就是一個(gè)函數(shù)驴剔,它具有三個(gè)參數(shù)target、key粥庄、descriptor丧失。target是裝飾的對(duì)象,key是裝飾對(duì)象的具體屬性惜互,也就是修飾器緊跟其后的屬性名字布讹。descriptor是該屬性的描述對(duì)象,自帶configurable训堆、value描验、enumerable、writable坑鱼、__proto__屬性膘流。

裝飾類

function decorator(target) {

????target.age = 20; // 為類添加靜態(tài)屬性

????target.prototype.grade = 3; // 為類添加實(shí)例屬性

}

@decorator

class Student{ }

const student = new Student();

console.log(student.age);? //20

console.log(student.grade)? //3

上述方法中,本身Student類沒有任何屬性,因?yàn)樽⑷胙b飾器之后呼股,Student擁有了靜態(tài)屬性age和實(shí)例屬性grade耕魄。裝飾器除了可以裝飾類,還可以裝飾類的方法彭谁。

裝飾類的方法

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(this, arguments);

????};

????return descriptor;

}

const math = new Math();

add(2, 4);

//calling add with [2屎开,4]

@log是一個(gè)打印裝飾器,裝飾了Math類的add函數(shù)马靠,通過修改屬性描述對(duì)象的值descriptor.value實(shí)現(xiàn)打印功能。裝飾后蔼两,每次調(diào)用add函數(shù)都會(huì)打印調(diào)用時(shí)的相關(guān)日志甩鳄。

注意:如果同一個(gè)方法有多個(gè)修飾器,會(huì)像剝洋蔥一樣额划,先從外到內(nèi)進(jìn)入妙啃,然后由內(nèi)向外執(zhí)行。

裝飾器在react中的應(yīng)用

@connnet裝飾器

react-redux的常規(guī)使用俊戳,一般需要先定義UI組件后揖赴,再使用connect函數(shù)將UI組件變?yōu)槿萜鹘M件導(dǎo)出

class UIComponent extends React.Component {? }

const ContainerComponent = connect( mapStateToProps , mapDispatchToProps )( UIComponent );

export default ContainerComponent;

使用裝飾器后,無需再定義容器組件

@connect( mapStateToProps? , mapDispatchToProps )

class UIComponent extends React.Component {? }

export default UIComponent;

定制高階組件

有時(shí)業(yè)務(wù)中需要定義自己的高階組件抑胎,實(shí)現(xiàn)代碼的復(fù)用燥滑。比如在業(yè)務(wù)開發(fā)中,每個(gè)頁面的預(yù)加載功能可以作為一個(gè)裝飾器阿逃。



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铭拧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恃锉,更是在濱河造成了極大的恐慌搀菩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件破托,死亡現(xiàn)場(chǎng)離奇詭異肪跋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)土砂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門州既,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萝映,你說我怎么就攤上這事易桃。” “怎么了锌俱?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵晤郑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)造寝,這世上最難降的妖魔是什么磕洪? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮诫龙,結(jié)果婚禮上析显,老公的妹妹穿的比我還像新娘。我一直安慰自己签赃,他們只是感情好谷异,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锦聊,像睡著了一般歹嘹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孔庭,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天尺上,我揣著相機(jī)與錄音,去河邊找鬼圆到。 笑死怎抛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芽淡。 我是一名探鬼主播马绝,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼挣菲!你這毒婦竟也來了迹淌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤己单,失蹤者是張志新(化名)和其女友劉穎唉窃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纹笼,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纹份,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了廷痘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔓涧。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖笋额,靈堂內(nèi)的尸體忽然破棺而出元暴,到底是詐尸還是另有隱情,我是刑警寧澤兄猩,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布茉盏,位于F島的核電站鉴未,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鸠姨。R本人自食惡果不足惜铜秆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讶迁。 院中可真熱鬧连茧,春花似錦、人聲如沸巍糯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祟峦。三九已至罚斗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搀愧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工疆偿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咱筛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓杆故,卻偏偏與公主長(zhǎng)得像迅箩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子处铛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • 1.初識(shí)裝飾模式 動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)饲趋。就增加功能來說,裝飾模式比生成子類更為靈活撤蟆。 Compone...
    王偵閱讀 682評(píng)論 0 0
  • 介紹 為對(duì)象添加新功能 不改變其原有的結(jié)構(gòu)和功能和適配器模式不一樣奕塑,適配器模式是原有的不能用了,而裝飾器模式是原來...
    林海_Mense閱讀 3,473評(píng)論 0 3
  • 裝飾器模式 無論何時(shí)我們想對(duì)一個(gè)對(duì)象添加額外的功能家肯,都有下面這些不同的可選方法龄砰。 如果合理,可以直接將功能添加到對(duì)...
    英武閱讀 5,142評(píng)論 1 50
  • 裝飾器模式 裝飾器模式是一種旨在提升代碼復(fù)用率的結(jié)構(gòu)性模式讨衣。有點(diǎn)類似于混入模式换棚,它被認(rèn)為是一種可以替代子類的可行方...
    pws019閱讀 341評(píng)論 0 0
  • 前言: 在談?wù)撗b飾器模式之前,先談一個(gè)筆者曾經(jīng)遇到過的問題反镇。游戲SDK(對(duì)游戲SDK開發(fā)不了解的話可以參考Andr...
    騎小豬看流星閱讀 10,440評(píng)論 11 27