美文网首页
(二)20.Decorator19-08-15

(二)20.Decorator19-08-15

作者: 你坤儿姐 | 来源:发表于2019-11-03 17:44 被阅读0次

Decorator

- 1基本概念

Decorator(修饰器)是一个函数用来修改类的行为,(扩展类的功能,只在类这个范畴内有用)

- 2基本用法

1.首先需要安装babel-plugin-transform-decortators-legacy包
LYKdeMacBook-Pro:coding-98 hm$ npm install babel-plugin-transform-decorators-legacy --save-dev
2.修改babelrc文件

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

3.实例, 定义一个只读修饰器

{
//定义一个修饰器函数
  //target 修改的类本身 修改的属性名称  该属性的描述对象
  let readonly=function(target,name,descriptor){
    descriptor.writable=false;//提供只读,写的功能false
      return descriptor
  };

//用在类里, 修改类的行为
  class Test{
    //@readonly 这种方式使用修饰器
    @readonly //这个就是刚刚写的修饰器名称 名称一定要和修饰器一致 否则找不到
    time(){
      return '2017-03-11'
  }
 }

//生成一个实例test
  let test=new Test();
//这里试图改写test的time方法   使用了只读功能的修饰器,这样写会报错 如下图
  test.time=function(){
    console.log('rest time');
  };
  console.log(test.time());
}

用了只读功能的修饰器,改写time方法报错如下:


屏幕快照 2019-08-16 10.41.04.png

4.修饰器也可以在类外面使用
在类外面使用必须写在类前面

{
  let typename=function(target,name,descriptor){
    target.myname='hello';
  }

  @typename
  class Test{

  }
  console.log('类修饰符',Test.myname);//myname属于静态属性
}

打印结果:
类修饰符 hello

有第三方修饰器的js库:core-decorators;

安装:npm install core-decorators
安装之后直接用 例如: @typename 的方式引用就可以了

3.修饰器不一样的写法 (更加有复用性 可维护性)

{
  //先写一个修饰器对应的方法,
  //通过箭头函数传一个type值
  let log=(type)=>{
    //返回一个function这个function就是修饰器的几个参数
    return function (target,name,descriptor) {
      let src_method=descriptor.value;
      descriptor.value=(...arg)=>{
        src_method.apply(target,arg);
        console.info(`log ${type}`);
      }
    }
  }

  class AD{
    @log('show')
    show(){
      console.info('ad is show')
    }
    @log('click')
    click(){
      console.log('ad is click');
    }
  }

  let ad=new AD();
  ad.show();
  ad.click();
}

打印结果:
ad is show
log show
ad is click
log click

相关文章

  • (二)20.Decorator19-08-15

    Decorator - 1基本概念 Decorator(修饰器)是一个函数用来修改类的行为,(扩展类的功能,只在类...

  • 二(二)

    发什么神经 突然就很想花钱 一边心疼 一边毫不在乎的花 啧 莫名其妙

  • 二,二

    2017.9.11教师节后的周一,第一次走进教室,刚站到讲台两个小可爱送给我两束花,原谅我那时候人还没有认全没有记...

  • 二〇二〇

    本来这篇小结打算年初写的,但是想想后边还有复试就先放一放,结果复试结束后过了两个月才想起要写这篇小结... 时过境...

  • 二金二木二火二土

    今天看完了极简中国史,这本书看了半个多月,因为是八十年前写的书,不是白话文,所以看的特别累。不过从近代前辈的角度去...

  • 说二『似二非二的二』

    说实话原以为他最多似二,生活小节或许专门学着似二,中枢神经应该不至于非二,没想到最近越来越疯狂地绞尽脑汁地朝着二的...

  • 二胎(二)

    今天宝宝三十周了,还有十周你就要出来了,也许会提前,妈妈和家人都很期待。 到了孕晚期,睡觉是个问题,左睡右睡都不对...

  • 二小姐(二)

    我去了李家,那环境好,夫人老爷小姐都很和蔼,我正坐在由木头和瓷做的椅子上,正等待着女管家来接我,我人生地不熟...

  • 二、递归(二)

    一、棋盘分割问题 【每次切完一个棋盘,就是需要舍弃掉一面,只能在一面操作】

  • 二选二

    既然已经分手了,那就应该正视我们的故事。待成熟睿智的甘露填补满年少轻狂的洼壑,你再回过头来,促膝把酒花前月下也能...

网友评论

      本文标题:(二)20.Decorator19-08-15

      本文链接:https://www.haomeiwen.com/subject/xrhtsctx.html