您好,登錄后才能下訂單哦!
這篇文章主要講解了“JavaScript裝飾器模式怎么用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“JavaScript裝飾器模式怎么用”吧!
裝飾器模式想必大家并不陌生:它允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu),屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個(gè)包裝。
這種模式創(chuàng)建了一個(gè)裝飾類,用來(lái)包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
在 JS 中,裝飾器(Decorator
)是ES7中的一個(gè)新語(yǔ)法,它可以對(duì)類、方法、屬性
進(jìn)行修飾
,從而進(jìn)行一些相關(guān)功能定制。它的寫法與Java的注解(Annotation
)非常相似,但是功能還是有很大區(qū)別。
代碼示例:
不使用裝飾器:
const log = (srcFun) => { if(typeof(srcFun) !== 'function') { throw new Error(`the param must be a function`); } return (...arguments) => { console.info(`${srcFun.name} invoke with ${arguments.join(',')}`); srcFun(...arguments); } } const plus = (a, b) => a + b; const logPlus = log(plus); logPlus(1,2); // plus invoke with 1,2
使用裝飾器:
const log = (target, name, descriptor) => { var oldValue = descriptor.value; descriptor.value = function() { console.log(`Calling ${name} with`, arguments); return oldValue.apply(this, arguments); }; return descriptor; } class Math { @log // Decorator plus(a, b) { return a + b; } } const math = new Math(); math.plus(1, 2); // Calling plus with 1,2
從上面的代碼可以看出,如果有的時(shí)候我們并不需要關(guān)心函數(shù)的內(nèi)部實(shí)現(xiàn),僅僅是想調(diào)用它的話,裝飾器能夠帶來(lái)比較好的可讀性,使用起來(lái)也是非常的方便。
// readonly 裝飾器 import { readonly } from 'core-decorators'; class Fudao { @readonly title = 'A'; } var fudao = new Fudao(); fudao.title = 'B'; // This will log error & doesn't work
JS中的裝飾器本質(zhì)也是一個(gè)函數(shù),利用的是JS中object
的descriptor
;
裝飾類和被裝飾類可以獨(dú)立發(fā)展,不會(huì)相互耦合,裝飾模式是繼承的一個(gè)替代模式,裝飾模式可以動(dòng)態(tài)擴(kuò)展一個(gè)實(shí)現(xiàn)類的功能。
感謝各位的閱讀,以上就是“JavaScript裝飾器模式怎么用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)JavaScript裝飾器模式怎么用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。