博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ES7之Decorators实现AOP示例
阅读量:7074 次
发布时间:2019-06-28

本文共 1651 字,大约阅读时间需要 5 分钟。

在上篇博文中,笔者利用CoffeeScript支持的高阶函数,以及方法调用可省略括符的特性,实现了一个类似Python装潢器的日志Demo。这只是一种伪实现,JavaScript实现装潢器,我们需要等到ECMAScript7才行,在ES7特性中带来了Decorators,它就是我们所需要的装潢器特性。虽然它是ES7的特性,但在Babel大势流行的今天,我们可以利用Babel来使用它。关于Babel的推荐文章,请参见另一篇文章。

下面我们仍然和上节一样,实现一个ES7 Decorators版的日志拦截示例。我们希望得到的代码效果如下:

class MyClass {  @log('MyClass add')  add(a, b){    return a + b;  }  @log('MyClass product')  product(a, b){    return a * b;  }  @log('MyClass error')  error(){     throw 'Something is wrong!';   }}

在ES7中Decorators,也是一个函数,我们只需要在它前面加上@符号,并将它标注在特定的目标,如class、method等,则可以实现方法的包裹拦截。它的传入参数有:target, name, descriptor。它们分别标记目标,标记目标名称,以及目标描述信息。在descriptor中,包括configurable、enumerable、writable,value四个属性。它们分别可以控制目标的读写、枚举,以及目标值。

所以我们可以如下实现:

let log = (type) => {    const logger = new Logger('#console');    return (target, name, descriptor) => {      const method = descriptor.value;      descriptor.value =  (...args) => {            logger.info(`(${type}) before function execute: ${name}(${args}) = ?`);            let ret;            try {                ret = method.apply(target, args);                logger.info(`(${type})after function execute success: ${name}(${args}) => ${ret}`);            } catch (error) {                logger.error(`(${type}) function execute error: ${name}(${args}) => ${error}`);            } finally {                logger.info(`(${type}) function execute done: ${name}(${args}) => ${ret}`);            }            return ret;        }    }}

首先我们将原来的方法体缓存起来,直到方法调用时,才会被调用以实现方法调用前后的日志拦截,打印相关信息。示例的效果如下:

es7 decorators log aop

整个demo示例,你也可以在codepen上细细把玩:

See the Pen  by green () on .

本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/p/es7-decorators-log-aop.html,如需转载请自行联系原作者

你可能感兴趣的文章
机器学习---学习首页
查看>>
smarty详解二:从文件读取变量、保留变量、数学计算、内建函数
查看>>
java 多线程简介
查看>>
SQLSserver2008安装默认账户介绍
查看>>
MySQL:NULL?
查看>>
mysql select 结果集循环
查看>>
django返回json的几种方法以及android调用
查看>>
利用JavaScript全选、反选复选按钮
查看>>
js 键盘码对应表
查看>>
MogileFS安装配置实战
查看>>
Java Concurrency(一)
查看>>
centos 7更改网卡名字
查看>>
安装gitlab
查看>>
本季度学习内容
查看>>
Android 权限大全中英对照
查看>>
动态素组(ArrayList)
查看>>
linux下部署tomcat指定JDK版本编译并运行javaWEB应用
查看>>
drbd+corosync+pacemaker实现mysql的高可用性“下”
查看>>
TCP协议中FLAG的含义
查看>>
Navicat for MySQL之HTTP和SSH远程连接数据库
查看>>