当前位置: 首页 > Web前端 > CSS

前端AOP

时间:2023-03-31 13:42:40 CSS

野子电竞数据官网改版https://www.xxe.io/全新登场前端工程借鉴了后端、设计模式、MVC、组件化、模块化等诸多成功经验,等,结合前端分层和分而治之的特点,逐渐变得复杂起来。在angular中,ioc和di的概念也开始盛行,结合起来还不错,但是aop这个名词真的很少见,可能是我太无知了,只好自己百度了。刚开始听到前端AOP这个词的时候有点惊讶。我知道如何开发后端。SPRING的AOP已经深入人心。切片和入口点是核心概念,但是javascriptAOP在项目中还是没有做。经过。js是一种语法松散灵活的解释型语言。它是一种非强类型语言。它是一种自然的函数式语言。除了值类型,有些是对象,包括函数。前端开发一直都是一个页面,生产在一个页面上做AOP有什么意义呢?而且我还没有听说过任何框架中的AOP。后来查了一下,发现确实存在。在DOJO的框架下比较流行,但是我没有用过DOJO,所以没有深入了解。所以我说如果需要用到AOP,可以用JS闭包来完成,先调用一个切面方法再调用其他方法。现在想想,我觉得这话是对的。前端模块化基本上是用闭包来实现的。如果没有封装,都是松散的JS文件。我们如何谈论AOP?AOP一般用在什么地方?日志记录、权限检查和事务处理,我认为权限检查和事务处理最好在后端完成。逻辑或者数据库层就容易多了,但是在前端做权限检查是不安全的,因为JS和HTML都是文本格式,代码是暴露在前端的,所以只能做一些弱的检查完毕。日志记录可能是前端AOP的主要应用方向,但是前端代码运行在浏览器中,很难将日志记录记录在文件中。您只能使用cookie或控制台。前者不适合做日志,因为会降低Performance,后者主要用于调试代码,所以我觉得AOP的作用不明显,理解就好。使用回调实现AOP:advice=function(originalFunc){console.log("beforefunction");originalFunc();console.log("afterfunction");}varobj={foo:function(){console.log('foo');}}advice(obj.foo)1234567891011这是最简单的。要使用AOP,我们必须通过通知来调用每个方法,不够友好。需要做一些封装,用闭包来控制:(以下代码来自网络)functionaround(obj,prop,advice){varexist=obj[prop];varprevious=function(){returnexist.apply(obj,arguments);};varadvised=advice(previous);obj[prop]=function(){//调用remove时advised为空//使用闭包的作用域链访问advised和previous变量,根据advised是否为空可以决定调用谁闭包的chain,remove的时候设置advised为空,这样执行过程就不会进入thisaround//这些不能被删除//obj[prop]=exist;建议=空;建议=空;//上一个=空;//存在=空;//obj=null;}}123456789101112}varcount=1;advice=function(originalFunc){varcurrent=count++;returnfunction(){console.log("beforefunction"+current);originalFunc.apply(this,arguments);console.log("afterfunction"+current);}}varobj={foo:function(arg){console.log(this.name+"and"+arg);},name:"obj"}h1=around(obj,'foo',advice);h2=around(obj,'foo',advice);obj.foo('helloworld');//beforefunction2//beforefunction1//objandhelloworld//afterfunction1//afterfunction2h1.remove();obj.foo('helloworld');//beforefunction2//objandhelloworld//afterfunction2h2.remove();obj.foo('helloworld');//objandhelloworld123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960around前面两个参数指定了对象和对象上的方法,后一个参数指定了切面方法,thepurposeofcallingapplyistopreventthisfrompointingtoobj