`
javatoyou
  • 浏览: 1012900 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一个函数5行代码即可实现完整的面向方面AOP编程功能

 
阅读更多
你相信么,在JavaScript只需一个函数5行代码即可实现完整的面向方面AOP编程功能。这5行代码的功能包括: 无限层次的函数无害拦截 函数执行前拦截 检查函数的参数值 重新设定函数的参数值 函数执行后拦截 检查函数执行后的返回结果 重新设定函数的返回结果 虽然动态函数式语言的效率是一个存在的问题,但是对于它的高度灵活性,简直让人令人惊叹不已,剧赞。 这个小小的函数源自于和爱明兄的一次讨论:在javascript中不修改源代码的形式扩充新功能的完美方式。 至于为啥要不直接修改别人源代码库,你想,当你辛苦修改后,人家发布了一个新版本,你是不是又要重新 修改一次?如果修改的地方少还好,多了的话,嘿嘿!所以,不是你的东西,最好不要动,除非你确定要自 己完全维护所有的代码(如果你实在太闲)。 为了给开发人员一个榜样,俺不得不写一个patch样例,最开始俺写的patch方式是这样滴: FCKEditingArea.prototype.FckMediaStart = FCKEditingArea.prototype.Start; FCKEditingArea.prototype.Start = function( html, secondCall ) { var sHeadExtra = '<link href="' + FCKConfig.PluginsPath + 'media/css/fck_media.css" rel="stylesheet" type="text/css" _fcktemp="true" />' ; html = html.replace( FCKRegexLib.HeadCloser, sHeadExtra + '$&' ) ; return this.FckMediaStart(html, secondCall); } 俺觉得这种补丁方式是不太让我满意的 爱民兄提到他喜欢这样patch方式: FCKEditingArea.prototype.Start = function( func ) { return function( html ) { html = html.replace( FCKRegexLib.HeadCloser, sHeadExtra + '$&' ) ; return func.apply(this, arguments); } }(FCKEditingArea.prototype.Start); 这种方式的确不存在漏洞了,perfect,但是却把我彻底弄懵了,看得我头大啊!琢磨了好久才算明白过来。 不过从管理角度考虑,如果程序中到处都是这样的方式,那么将大大降低程序的可读性,增加维护代码的成本 (ps,要开发维护这样的代码,你不得不请JS高级程序员才行)。 为了限制匿名函数的滥用导致的可读性下降,俺写了一个Inject()函数的雏形(将匿名函数的使用限制在其中), 经过爱民兄修改,然后又是讨论,然后我们又修改,如此反复,达到这个最终版本(也许还不是,谁知道呢)。 好了,荣誉归于爱民,臭鸡蛋归于俺,闲话少说,看看代码吧,不算上注释,这个Inject函数正好5行。如果你清楚 的知道匿名函数的特点,那么这个函数,你就不难看懂,否则你就只能管用了。用法在注释的例子里,够简单吧。 /* @desc inject the function @param aOrgFunc the original function to be injected. @param aBeforeExec this is called before the execution of the aOrgFunc. you must return the arguments if you wanna modify the value of the aOrgFunc's arguments . @param aAtferExec this is called after the execution of the aOrgFunc. you must add a result argument at the last argument of the aAtferExec function if you wanna get the result value of the aOrgFunc. you must return the result if you wanna modify the result value of the aOrgFunc . @Usage Obj.prototype.aMethod = Inject(Obj.prototype.aMethod, aFunctionBeforeExec[, aFunctionAtferExec]); @author Aimingoo&Riceball eg: var doTest = function (a) {return a}; function beforeTest(a) { alert('before exec: a='+a); a += 3; return arguments;}; function afterTest(a, result) { alert('after exec: a='+a+'; result='+result); return result+5;}; doTest = Inject(doTest, beforeTest, afterTest); alert (doTest(2)); the result should be 10. */ function Inject( aOrgFunc, aBeforeExec, aAtferExec ) { return function() { if (typeof(aBeforeExec) == 'function') arguments = aBeforeExec.apply(this, arguments) || arguments; //convert arguments object to array var Result, args = [].slice.call(arguments); args.push(aOrgFunc.apply(this, args)); if (typeof(aAtferExec) == 'function') Result = aAtferExec.apply(this, args); return (typeof(Result) != 'undefined')?Result:args.pop(); } }

分享到:
评论

相关推荐

    jquery-aop:向 jQuery 添加面向方面编程 (AOP) 的功能

    向 jQuery 添加面向方面编程 (AOP) 的功能。 介绍 jQuery AOP 是一个非常小的插件,它为 javascript 添加了功能。 它允许向任何全局或实例对象添加( Before 、 After 、 After Throw 、 After finally 、 Around和...

    浅谈Android面向切面编程(AOP)

    AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性...

    NC AOP 方式的描述和使用

    我们使用面向方面编程时,原来的组件功能不会受到影响,而对组件起辅助作用的函数被模块化到特殊的对象里,这些对象就称为“方面”。在部署文件里集中指明这些“方面”何时、何地能起到作用,从而避免代码到处分散。

    JavaScript实现AOP详解(面向切面编程,装饰者模式)

    什么是AOP? AOP(面向切面编程)的主要...通常,在 JavaScript 中实现 AOP,都是指把一个函数“动态织入”到另外一个函数之中,具体的实现技术有很多,下面我用扩展 Function.prototype 来做到这一点。请看下面代码:

    AOP for Erlang:Erlang的面向方面的编程(AOP)-开源

    针对Erlang的面向方面编程(AOP)的实现。 AOP编织器针对目标源文件集运行,并受方面定义控制。 编织器被实现为Erlang编译器的解析转换函数。

    关于AOP在JS中的实现与应用详解

    AOP是OOP的延续,是软件开发中的一个热点,也是JAVA 中Spring框架的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可...

    springaop学习方法

    AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性...

    aspiration:进行面向方面编程的受限方法

    由于在我自己的代码库中出现了面向方面编程的需求,因此我试图提出一种更受限制的AOP类型,这种类型更易于推理,但仍提供了与成熟的AOP相同的优点。 如下所述,主要区别在于代码中只有一个地方将回调(在AspectJ...

    JavaScript中AOP的实现与应用

    AOP (Aspect Oriented Programming) ,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是函数式编程的一种衍生,利用AOP可以对业务逻辑的各个部分进行隔离...

    AOPDemo:AOP切面demo

    AOPDemo 这是一个Android的AOP切面demo AOP是Aspect Oriented ...AspectJ实际上是对AOP编程思想的一个实践,AOP虽然是一种思想,但就好像OOP中的Java一样,一些先行者也开发了一套语言来支持AOP。目前用得比较火的

    使用AOP改善javascript代码

    Aop又叫面向切面编程,用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点,这篇就通过下面这几个小例子,来说说AOP在js中的妙用. 1, 防止[removed]被二次覆盖. 2,无侵入的统计代码. 3, ...

    to-aop:使用ES6代理使用JavaScript进行面向方面的编程的库

    例如,我正在使用它向缺少所有调试代码的生产代码添加挂钩。 我没有访问实例的权限,但只有类构造函数。 但是用法是无限的。 有关AOP的更多文章: 例子: 安装 npm i to-aop --save 用法 本机Date.now方法的...

    aop4php:介绍 AOP 世界的小型 PHP 库

    支持面向方面的编程 (AOP) 的语言更常使用用于一组点的函数 - 切入点。 这些点的功能由程序代码决定,它被礼貌地称为 Advice (AspectJ)。 因此,方面描述了一组特定系统组件的横切关注点。 组件本身仅包括它们应该...

    Java的反射机制讲解案例代码 Class类、 获取类的结构信息:构造函数、方法和字段,动态创建对象、调用方法和设置属性

    内容概要 Java的反射机制是指在运行时通过...实现动态代理和AOP(面向切面编程)等高级特性。 掌握反射机制的目标是能够在运行时获取类的信息,并灵活地利用这些信息来完成所需的操作,以增加程序的灵活性和可扩展性。

    Spring面试题

    ☆ Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象...

    C#开源的AOP框架–KingAOP基础

    AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。Spring框架用的核心技术就是AOP,是函数式编程的一种衍生范型。利用AOP的好处就是可以对业务...

    关于JavaScript中高阶函数的魅力详解

    一个函数就可以接收另一个函数作为参数,简言之,函数的参数能够接收别的函数,这种函数就称之为高阶函数 JavaScript 的高阶函数跟 Swift 的高阶函数类似 常见的高阶函数有: Map、Reduce、Filter、Sort 高阶函数是指...

    java面试题

    游标是对查询出来的结果集作为一个单元来有效的处理,可以对结果集的当前行做修改。 select执行顺序? 答:from where group by having select order by Collection和Collections的区别? 答:Collection是集合...

    SpringAOP学习笔记

    AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性...

    Android AOP切面编程+动态权限申请

    我们在一个项目中会有很多模块或者函数(在图中统称为任务,下同)要使用,而在进行某些任务之前,或者之后,或者进行任务的前后,这里假设是从数据库获取数据的任务,都需要做同样的某个动作,比如计算进行这个任务...

Global site tag (gtag.js) - Google Analytics