es6 修飾器

寫在前面蜕衡,因?yàn)閒unction存在變量提升囚灼,所以修飾器是只能修飾類呢蛤,而不能修飾函數(shù)

  • 修飾器是一個(gè)函數(shù),用來(lái)修改類的行為或?qū)傩?/li>
function testable(target) {
  target.isTestable = true;
  //也可以修改類的原型特铝,
  target.prototype.isTestable = true
}
@testable
class MyTestableClass {}
// 上面的這一句等同于 MyTestableClass = testable(MyTestableClass)
console.log(MyTestableClass.isTestable) // true

翻譯過(guò)來(lái)暑中,其實(shí)它是這樣的

@decorator
class A {}
// 等同于
class A {}
A = decorator(A) || A;

所以可以看出修飾器其實(shí)就是一些函數(shù),用來(lái)修改類的行為(原型鲫剿,靜態(tài)屬性...都可以)鳄逾,只不過(guò)這些行為可能有公共性,所以就寫一個(gè)方法去改變灵莲,然后取了一個(gè)裝逼的名字叫修飾器

  • 既然修飾器是一個(gè)函數(shù)雕凹,那么參數(shù)肯定少不了
function testable(isTestable) {
      return function(target) {
              target.isTestable = isTestable;
       }
}
@testable(true)
class MyTestableClass {}
MyTestableClass.isTestable // true
@testable(false)
class MyClass {}
MyClass.isTestable // false

有點(diǎn)繞啊... 慢慢來(lái)

testable(true)
//相當(dāng)于返回一個(gè)函數(shù),我們用個(gè)變量接收一下
let resultFunc = testable(true)
//就相當(dāng)于
let resultFunc = function(target){
      target.isTestable = true
}
//現(xiàn)在繼續(xù)修飾
@resultFunc
class MyTestableClass{}
//等同于原來(lái)的
@testable(true)
class MyTestableClass{}
// 是不是OK了政冻,要是需要多個(gè)參數(shù)枚抵,那就再最外面的函數(shù)中多傳就行

再來(lái)看一個(gè)列子,鞏固一下

function mixins(...list) {
      return function (target) {
        // 其實(shí)直接在外面使用這一句話就好明场,非要裝逼搞個(gè)修飾器的概念汽摹,好吧...,我承認(rèn)是因?yàn)檎镜牧?chǎng)不同,我是使用者的立場(chǎng)苦锨,他們是規(guī)范的立場(chǎng)
         Object.assign(target.prototype, ...list)
       }
}
const Foo = {
       foo() { console.log('foo') }
};
@mixins(Foo)
class MyClass {}
let obj = new MyClass();
obj.foo() // 'foo'
  • 修飾類的屬性
class Person {
       @readonly
       name() { return `${this.first} ${this.last}` }
}
function readonly(target, name, descriptor){
          // descriptor對(duì)象原來(lái)的值如下
          // {
          //   value: specifiedFunction,
          //   enumerable: false,
          //   configurable: true,
          //   writable: true
          // };
          descriptor.writable = false;
          return descriptor;
}
readonly(Person.prototype, 'name', descriptor);
// 類似于
Object.defineProperty(Person.prototype, 'name', descriptor);

很難理解是嗎逼泣,通過(guò)控制臺(tái)輸出,我們發(fā)現(xiàn)target其實(shí)是當(dāng)前類(因?yàn)楝F(xiàn)在是在類里面使用)的原型舟舒,name就是下面的屬性名拉庶,descriptor就是這個(gè)屬性的描述,修飾器修改的其實(shí)就是這個(gè)描述秃励,不知道描述是什么..請(qǐng)自行查閱資料,再來(lái)看一個(gè)例子

class Math {
     @log
     add(a, b) {
       return a + b;
     }
}
function log(target, name, descriptor) {
     var oldValue = descriptor.value;
     // 打印出來(lái)發(fā)現(xiàn)氏仗,oldValue其實(shí)就是function add(){}
     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);
  • 若是同一個(gè)方法有多個(gè)修飾器,會(huì)從外向內(nèi)進(jìn)入夺鲜,然后由內(nèi)向外執(zhí)行(簡(jiǎn)單理解就是把內(nèi)部執(zhí)行的結(jié)果當(dāng)做參數(shù)傳向外面的)
function dec(id){
    console.log('evaluated', id);
    return (target, property, descriptor) => console.log('executed', id);
}
class Example {
    @dec(1)
    @dec(2)
    method(){}
}
// evaluated 1
// evaluated 2
// executed 2
// executed 1
  • babel的支持性皆尔,需要安裝babel-plugin-transform-decorators插件,然后配置.babelrc,
npm install babel-core babel-plugin-transform-decorators
// .babelrc
{
  "plugins": ["transform-decorators"]
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谣旁,一起剝皮案震驚了整個(gè)濱河市床佳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榄审,老刑警劉巖砌们,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浪感,警方通過(guò)查閱死者的電腦和手機(jī)昔头,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)影兽,“玉大人揭斧,你說(shuō)我怎么就攤上這事【撸” “怎么了讹开?”我有些...
    開(kāi)封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捐名。 經(jīng)常有香客問(wèn)我旦万,道長(zhǎng),這世上最難降的妖魔是什么镶蹋? 我笑而不...
    開(kāi)封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任成艘,我火速辦了婚禮,結(jié)果婚禮上贺归,老公的妹妹穿的比我還像新娘淆两。我一直安慰自己,他們只是感情好拂酣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布秋冰。 她就那樣靜靜地躺著,像睡著了一般踱葛。 火紅的嫁衣襯著肌膚如雪丹莲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天尸诽,我揣著相機(jī)與錄音甥材,去河邊找鬼。 笑死性含,一個(gè)胖子當(dāng)著我的面吹牛洲赵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播商蕴,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼叠萍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绪商?” 一聲冷哼從身側(cè)響起苛谷,我...
    開(kāi)封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎格郁,沒(méi)想到半個(gè)月后腹殿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體独悴,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年锣尉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刻炒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡自沧,死狀恐怖坟奥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拇厢,我是刑警寧澤爱谁,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站旺嬉,受9級(jí)特大地震影響管行,放射性物質(zhì)發(fā)生泄漏厨埋。R本人自食惡果不足惜邪媳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荡陷。 院中可真熱鬧雨效,春花似錦、人聲如沸废赞。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唉地。三九已至据悔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耘沼,已是汗流浹背极颓。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留群嗤,地道東北人菠隆。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狂秘,于是被迫代替她去往敵國(guó)和親骇径。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理者春,服務(wù)發(fā)現(xiàn)破衔,斷路器,智...
    卡卡羅2017閱讀 134,714評(píng)論 18 139
  • (a fork of Airbnb's Javascript Style Guide) Strikingly ES...
    飄零_zyw閱讀 1,169評(píng)論 1 2
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉钱烟,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,726評(píng)論 0 9
  • “兒子,在某個(gè)意義上传惠,你就是我迄沫,我就是你” “霍元甲幼時(shí)也與你一樣,都是早產(chǎn)的孩子卦方,他的父親憐惜兒子羊瘩,認(rèn)為霍元甲...
    燕萊春靈閱讀 423評(píng)論 0 1
  • 前世的千百次回眸, 才換來(lái)今生的相視一笑! 我們還能不能再見(jiàn)面盼砍, 我在佛前苦苦求了幾千年! 人緣佛緣心緣情緣尘吗, 萬(wàn)...
    畫心心語(yǔ)閱讀 377評(píng)論 3 14