Decorators修饰器

修饰器是一个函数,通过修饰器能修改类的行为,也可理解为扩展类的功能,在类这个范围内有效。

插件

使用修饰器还需要安装一个插件 import babel-plugin-transform-decorators-legacy在.babelrc文件中引入如下文件:

```javascript
{
  "plugins":["transform-decorators-legacy"]
}

注意: ES6中默认开启严格模式,要在ES5中使用需要有这句命令 use strict 强制开启严格模式。

案例

  • 案例一:限制某个属性为只读

修饰器的第三方js库:core-decorators; npm install core-decorators,import引入后,直接在项目中写@readonly就可以了,不用向下面在定义readonly ```javascript { let readonly = function(target,name,descriptor){ descriptor.writable = false; return descriptor; }

class Test{ @readonly time(){ return '2017-06-14'; } }

let t1 = new Test(); console.log(t1.time()); //2017-06-14

let t2 = new Test();

//此时 time为只读 再次设置将会报下面错误 t2.time = function(){ console.log('reset time'); }

console.log(t2.time()); //Uncaught TypeError: Cannot assign to read only property 'time' of object '#' }


- **案例一:点击统计**

> 日志系统,比如广告,我们会为其做展示、点击统计

```javascript
{
  //先写一个修饰器,type表示的是show 还是 click
  let log = (type) => {
    return function(target,name,descriptor){
      //保存一下原始的函数体
      let src_method = descriptor.value;
      //重新进行赋值
      descriptor.value = (...arg) => {
        src_method.apply(target,arg);
        //如果将来发送买点接口变了,只需要改log对应的这个方法就可以了
        console.info(`log ${type} `);
      }
    }
  }

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

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

  let ad = new AD();

  ad.show();
  ad.click();
}

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「IT平头哥联盟」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""