[ECMAScript] 配置和使用Decorator

1. 目錄結(jié)構(gòu)

- dist
    example.js
- example
    index.html
    index.js
+ node_modules

.babelrc
package.son
webpack.config.js

2. 環(huán)境配置

(1)配置工程依賴:./package.json

{
  "name": "test-decorator",
  "version": "1.0.0",
  "dependencies": {},
  "devDependencies": {
    "babel-loader": "^6.2.10",
    "babel-plugin-transform-decorators-legacy": "^1.3.4",
    "babel-preset-stage-0": "^6.24.1",
    "webpack": "^1.13.1"
  }
}

(2)配置Babel:./babelrc

{
    "presets": [
        "es2015",
        "stage-0"
    ],
    "plugins": [
        "transform-decorators-legacy"
    ]
}

(3)配置Webpack:./webpack.config.js

module.exports = {
    entry: {
        example: './example/index.js'
    },
    output: {
        path: './dist/',
        filename: '[name].js',
        libraryTarget: 'umd'
    },
    module: {
        loaders: [{
            test: /.js$/,
            loader: 'babel-loader'
        }]
    }
};

3. 用例

const D1 = Class => {

    //Class沒有v0這個屬性
    console.log(Class.v0);    //undefined
    Class.v0 = 1;
    return Class;
};

const D2 = Class => {

    //可以獲取靜態(tài)屬性
    console.log(Class.v1);    //0
    Class.v1 = 2;
    return Class;
}

const D3 = Class => {
    const f1 = Class.f1;

    //可以獲取靜態(tài)屬性频丘,屬性為箭頭函數(shù)
    console.log(f1);    //x => x+1

    Class.f1 = z => f1(z) + 1;
    return Class;
}

const D4 = instance => {

    //當(dāng)實例為public class field時,無法獲取實例屬性
    console.log(instance.v2);    //undefined
    instance.v2 = 4;
    return instance;
}

const D5 = instance => {

    //當(dāng)實例為public class field時,無法獲取實例屬性
    console.log(instance.f2);    //undefined
    instance.f2 = z => z + 4;
    return instance;
};

const D6 = instance => {
    const f3 = instance.f3;

    //實例方法,可以獲取
    console.log(f3);    //x => x+1

    instance.f3 = z => f3(z) + 4;
    return instance;
};

@D1
class A {

    @D2
    static v1 = 0;    //static public class field

    @D3
    static f1 = x => x + 1;    //static public class field

    @D4
    v2 = 0;    //public class field

    @D5
    f2 = x => x + 1;    //public class field

    //You can't attach decorators to a class constructor
    constructor() { }

    @D6
    f3(x) {    //mothod
        return x + 1;
    }
};

console.warn(A.v0);    //1
console.warn(A.v1);    //2
console.warn(A.f1(1));    //3

const a = new A;
console.warn(a.v2);    //4
console.warn(a.f2(1));    //5
console.warn(a.f3(1));    //6

注意事項:
(1)constructor不能添加decorator
(2)decorator是一個函數(shù)左痢。
如果添加在類上或者類的靜態(tài)字段上,參數(shù)為這個類艘策,返回值將替換原來的類系草。

const f = Class => class B { };

@f
class A{

}

console.log(A);    //B

如果添加在實例字段或者方法上,參數(shù)為實例耙旦,返回值必須是一個對象脱羡,且該對象將被丟棄。

const f = x => {
    const fn = x.fn;
    x.fn = () => fn() + 1;

    return {
        v: 2
    };
};

class A {

    @f
    fn() {
        return 1;
    }

    gn() {
        console.log(this.fn());    //2

        //this還是原來的實例免都,而不是{v:2}
        console.log(this.v);    //undefined
    }
}

const a = new A;
a.gn();

(3)decorator修飾public class field時锉罐,如果該field是一個實例字段,則通過decorator的參數(shù)(參數(shù)是當(dāng)前類的實例)無法獲取該字段绕娘。
(可能是Babel的問題

(4)不在類中的普通函數(shù)脓规,不支持decorator。

const f = x => x;

// Leading decorators must be attached to a class declaration
@f
function g() {

}

console.log(g);

參考

Class and Property Decorators
babel-plugin-transform-decorators-legacy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末险领,一起剝皮案震驚了整個濱河市侨舆,隨后出現(xiàn)的幾起案子秒紧,更是在濱河造成了極大的恐慌,老刑警劉巖挨下,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熔恢,死亡現(xiàn)場離奇詭異,居然都是意外死亡臭笆,警方通過查閱死者的電腦和手機叙淌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愁铺,“玉大人鹰霍,你說我怎么就攤上這事∫鹇遥” “怎么了茂洒?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓶竭。 經(jīng)常有香客問我获黔,道長,這世上最難降的妖魔是什么在验? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任玷氏,我火速辦了婚禮,結(jié)果婚禮上腋舌,老公的妹妹穿的比我還像新娘盏触。我一直安慰自己,他們只是感情好块饺,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布赞辩。 她就那樣靜靜地躺著,像睡著了一般授艰。 火紅的嫁衣襯著肌膚如雪辨嗽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天淮腾,我揣著相機與錄音糟需,去河邊找鬼。 笑死谷朝,一個胖子當(dāng)著我的面吹牛洲押,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圆凰,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼杈帐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挑童,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤累铅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后站叼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體争群,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年大年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玉雾。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡翔试,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出复旬,到底是詐尸還是另有隱情垦缅,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布驹碍,位于F島的核電站壁涎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏志秃。R本人自食惡果不足惜怔球,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浮还。 院中可真熱鬧竟坛,春花似錦、人聲如沸钧舌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洼冻。三九已至崭歧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撞牢,已是汗流浹背率碾。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屋彪,地道東北人播掷。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像撼班,于是被迫代替她去往敵國和親歧匈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理砰嘁,服務(wù)發(fā)現(xiàn)件炉,斷路器勘究,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 前言 webpack2和vue2已經(jīng)不是新鮮東西了,滿大街的文章在講解webpack和vue斟冕,但是很多內(nèi)容寫的不是...
    技術(shù)宅小青年閱讀 6,535評論 4 43
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺口糕,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,160評論 7 35
  • 組合的意思就是磕蛇,一個對象是另一個對象的數(shù)據(jù)成員,比如手電筒和電池景描。 一個充電電筒中的電池、LED燈秀撇、按鈕…… 都可...
    望月成三人閱讀 226評論 0 0
  • 從日本回來已經(jīng)好些天了超棺,回顧整個這次日本之行,整個就是暴走之旅: 2月25日15002步 踏上旅途:成都-上海-大...
    soluna閱讀 773評論 0 3