首页 > 其他分享 >Thinking--AOP思想在前端中的应用

Thinking--AOP思想在前端中的应用

时间:2023-03-08 19:32:26浏览次数:34  
标签:function return Thinking Advice submit -- 模块 AOP 日志


Thinking系列,旨在利用10分钟的时间传达一种可落地的编程思想。

AOP

AOP(Aspect Oriented Programming),面向切面编程。其从主关注点中分离出横切关注点是面向侧面的程序设计的核心概念。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来。

具体到 Javascript 来说,由于语言本身的特性,天生就具有运行时动态插入逻辑的能力。重点在于在原函数上增加其他功能并不改变函数本身。

Spring中的Advice:前置通知(Before Advice)、后置通知(After Advice)、返回通知(After Return Advice)、环绕通知(Around Advice)、抛出异常后通知(After Throwing Advice)

javascript实现

Function.prototype.after = function (action) {
// 保留当前函数,这里this指向运行函数
var func = this
// return 被包装过的函数,这里就可以执行其他功能了
// 并且该方法挂在 Function.prototype 上,
// 被返回的函数依然具有 after 属性,可以链式调用
return function () {
// 原函数执行,这里不考虑异步
var result = func.apply(this, arguments)
// 执行之后的操作
action.apply(this, arguments)
// 将执行结果返回
return result
}
}

Function.prototype.before = function (action) {
var func = this
return function () {
action.apply(this, arguments)
return func.apply(this, arguments)
}
}
let beforeFn = function () {console.log('beforeFn')}
let afterFn = function () {console.log('afterFn')}
let fn = function () {console.log('fn')}
fn.before(beforeFn).after(afterFn)() // beforeFn fn afterFn

Thinking--AOP思想在前端中的应用_javascript

问题陈述

两个模块(A、B),由于两个模块相似度很高,且其中一个模块(A)是历史模块(已开发完成);所以我们采用 extends 方式,来扩展开发新的模块(B)。

历史 A 模块

<el-button @click="submit">查询</el-button>
<script>
export default {
name: 'A',
methods: {
submit () {
/* 主逻辑业务 */
}
}
}
</script>

现在,新模块(B)对于查询按钮的处理,需要发生变更,处理业务的同时需要发送相关日志。

对 A 模块进行改造,已适应新的方式

<el-button @click="submit">查询</el-button>
<script>
export default {
name: 'A',
methods: {
/* 将原有的逻辑业务代码进行抽离,便于新模块改造和沿用 */
submit () {
this.submitReq()
},
submitReq () {
/* 主逻辑业务 */
}
}
}

新模块(B),覆盖默认submit 方法,进行日志处理,下面采用常规的静态代理模式

export default {
name: 'B',
extends: 'A',
methods: {
/* 覆盖原有submit方法,增加日志采集处理 */
submit () {
// 这个来自于 A 模块
this.submitReq()
this.recordLogReg()
},
recordLogReg () {}
}
}

解决方案

export default {
name: 'B',
extends: 'A',
methods: {
/* 覆盖原有submit方法,增加日志采集处理 */
submit: this.submitReq.after(this.recordLogReg)(),
recordLogReg () {
/* 采集日志相关 */
}
}
}

每个函数变成了独立单元,可以随意组合,无需互相关联!
如果采用 class 写法,类的装饰器 decorator 也可以达到类似效果。


标签:function,return,Thinking,Advice,submit,--,模块,AOP,日志
From: https://blog.51cto.com/u_15998238/6108716

相关文章

  • vuex-router-sync 源码解析
    vuex-router-sync:路由状态管理,保持vue-router和vuex存储同步。import{sync}from'vuex-router-sync'importrouterfrom'@/router'importstorefrom'@/store'syn......
  • vue computed正确使用方式
    最近面试中,遇到一个小伙子,谈到了vue中的​​computed​​​和​​watch​​区别,最后得到了一个让我瞠目结舌的答案,只用​​watch​​,从不用​​computed​​模板内的......
  • 信道安全
    题目描述Alpha机构有自己的一套网络系统进行信息传送。情报员A位于节点1,他准备将一份情报发送给位于节点n的情报部门。可是由于最近国际纷争,战事不断,很多信道都有可能......
  • 搜索与图论3.2
    一、简述本节主要介绍一下有关最小生成树的两个算法,即\(Prim\)算法和\(Kruskal\)算法,适用于无向图。二、Prim算法基本思想\(Prim\)算法有一个适用于稠密图的朴素......
  • 内网穿透的高性能的反向代理应用FRP-自定义404错误页【实践可行版】
    frp简介frp是一个专注于内网穿透的高性能的反向代理应用,支持TCP、UDP、HTTP、HTTPS等多种协议。可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公......
  • 【MySQL】排序和分页
    排序ORDERBY多列;#强调格式:WHERE需要声明在FROM后,ORDERBY之前。先排序Country 再排序CustomerName,默认是按ASC排序的。SELECT*FROMCustomersORDERBYCountr......
  • python 提取列表元素打印不带中括号
    目录python提取列表元素打印不带中括号python提取列表元素打印不带中括号有个需求,需要对python3的列表切片,获取得到用户名后和手动输入的用户名比对,如果一致就打印true......
  • 寒假集训——基础数论6 线性代数
    矩阵定义简单来说矩阵就是一个\(n\)行\(r\)列的阵,实在不行可以理解成一个二维数组\[%开始数学环境\left[%左括号\begin{array}{ccc}......
  • vim: error while loading shared libraries: /lib64/libgpm.so.2: file too short
    在使用vim的时候出现了报错:[root@localhost~]#vimvim:errorwhileloadingsharedlibraries:/lib64/libgpm.so.2:filetooshort解决过程如下:yumreinstall-y......
  • MQ
    1:什么是mqmq的优缺点分别是什么MQ全称MessageQueue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。优点:应用解耦:提高系统容错性和可维......