当前位置:首页 > 日记 > 正文

使用AOP来改进Javascript代码

使用AOP来改进Javascript代码
AOP也被称为面向方面编程,Spring的学生对它很熟悉,而在JS中,AOP是一种被严重忽视的技术,本文通过下面的例子,比如说在JS中使用AOP。

1、防止在window.onload从被两次。

2、无创统计代码。

3、分开形式请求和核对。

4,动态地向Ajax请求添加参数。

5,责任链模式。

6,组合而不是继承。

先给出2段函数前后。顾名思义,就是一个函数在执行前或之后的另一个函数,巧妙的,前后都可以是这个函数的公共和参数,所以我们在那里玩的有很多。
对在window.onload处理被两次。

的时间去QQ群问问题前一段时间,重写在window.onload,如何不覆盖以前在window.onload函数。

最原始的解决方案必须直接添加你的新代码,原来在window.onload。
很显然,改变原始功能的需要是最具侵入性的做法之一。

另一个更好的解决方案是一个中间变量保存以前在window.onload。
这样,它将采取一些额外的成本管理和讨厌的中间变量__onload。

想象一下这一幕,当人们发现天气寒冷时,自然会选择穿貂皮大衣,而不是把自己的皮肤换成貂皮。动态装饰效益体现,功能完全不侵入之前。
非侵入性统计码

与逻辑无关的统计代码必须插入函数中,许多学生相信这一点。例如,下面的代码用于计算创建1000个节点的函数在用户计算机上花费的时间。
在AOP的方式中,函数中不需要更改,首先定义一个通用包装器。
只要一行代码,任何函数都可以添加到统计时间的函数中。
单独的表单请求和检查

在提交表格之前,我们经常做一些检查工作,以确保表格能正常提交。最糟糕的编写方法是将验证逻辑放置在发送函数中。
更好的方法是使用策略模式将所有检查规则放入一个集合中,并返回false或真值以决定是否通过验证。这允许您随意选择和替换检查规则。
所以还有一个缺点。检查和发送请求的2个请求耦合到一个函数。我们将他们从AOP,单独validata成插件,即插即用。我们只需要将发送函数转换为:
function.prototype.before前面的代码中不难看出,我们同意,当前函数返回false,将一个函数的执行下受阻,所以当validata返回false,将不再继续进行发送。之前,由于公众和论证上述功能和现有功能,所以价值参数可以顺利转移到validata功能。

动态添加参数到Ajax请求

在第一个例子中,在window.onload是后置装饰在前缀后。在Ajax请求之前动态添加许多参数。

我们遇到了很多的跨域请求,JSONP和iframe是很常见的。在我们的计划,说,JSONP请求参数键入= JSONP,键入= iframe说iframe请求。此外,2个请求的参数没有任何差别。然后你可以使用之前键入参数动态内部装饰。

首先定义Ajax请求的代理函数。

在这个函数中没有逻辑处理和分支语句。它不在乎它是JSONP请求或iframe请求。它只负责发送数据。这是一种很好的单一责任的功能。

接下来,在发送请求之前放置一个装饰器。
开始发送请求:
责任链模型。

JS中责任链模式的典型应用场景是事件冒泡。所有子节点和父节点都链接到一个链中,并且事件沿着这个链传递,直到一个节点能够处理它。职责链模式是消除太多if语句的工件。

以最近完成的一个需求为例,一个文件上传功能,提供控件,HTML5,flash,上传4上传。根据他们的优先级和支持,决定当前浏览器选择上传哪种方式。在我被改变之前,它是关于这个伪代码的:
当然,实际的代码远远小于那个,它还包括各种控件的初始化、容错等,我需要一天筛选出Flash,这似乎是一个简单的需要,但困难实际上类似于在心脏旁边去除一根羊毛血管。

如果您尝试作业链模型,看看它会有多容易:

第一步是重写前一个后一个函数,这样当返回一个对象时,责任链就会被阻塞,而当返回null时请求将继续。
接下来,每个控件的创建都封装在自己的函数中,以确保没有逻辑交叉和污染。
最后用责任链把它们串起来:
可以预见,有一天我需要再次屏蔽Flash,然后我只需要更改代码行。
组合代替继承

很多时候,当我们设计程序时,我们会遇到使用组合或继承的问题。一般来说,使用组合是更灵活和轻量级的。

我定义了一个父类上传,导出4类。

plugin_upload,html5_upload,flash_upload,和form_upload。

plugin_upload继承大部分的上传功能后,父类继承,然后自定义上传的一些特点。例如,其他3种上传方法是在选择文件之后上传,而控制上传则在上传之前进行一轮文件扫描。

第一种方法是plugin_upload继承和重写它的start_upload上传方法。
在一个较轻的组合,你可以直接与扫描功能start_upload装饰原有功能,甚至不需要得到一个额外的子类。

相关文章

画家画的两种风格美(古代美女和Loll

画家画的两种风格美(古代美女和Loll

两种,画家,古代,娃娃,风格,本教程介绍了用画家把两种风格的美画给大家,都是服装美的气质和洛丽塔娃娃的衣服花边。教程很实用,推荐给大家,希望对大家有帮助。 本教程介绍了画家用画两风格美的每个人,都是古装美女的气质和大师洛丽塔娃娃蕾丝服…

插图:铅笔画风格手绘涂鸦效果的艺术

插图:铅笔画风格手绘涂鸦效果的艺术

特征,铅笔画,插图,手绘,涂鸦,本教程将向你介绍一位朋友的艺术特征,用铅笔画铅笔画涂鸦效果。教程制作的艺术字很美,难度也不大。 本教程主要使用插画制作铅笔艺术风格的艺术字课程。在这段时间里,我被艺术课程困住了,它给你带来了素描风格的字…

ps使用油漆桶工具制作连续的图案教

ps使用油漆桶工具制作连续的图案教

工具,教程,连续,油漆,图案,本教程介绍给一个朋友,ps,使用油漆桶工具创建连续模式。本教程是比较基础的,非常适合初学者学习。推荐朋友一起学习。 对于许多初学者,当你刚刚接触PS图象处理软件的软件,你将不可避免地遇到一些问题,例如,如何用油漆桶…

PPT动画如何制作PPT制作教程

PPT动画如何制作PPT制作教程

动画,制作教程,电脑软件,PPT,如何制作PPT动画,跟随小编辑一起学习研究。 首先,我们需要准备工具和材料。我们使用的工具是PowerPoint2003。我们用的材料是枫叶画。所有工作就绪后,我们可以创建关于落叶的PPT动画。 PPT动画的第一步 打开PPT,单…

美丽的红葡萄酒箱盖的特殊效果,PS图

美丽的红葡萄酒箱盖的特殊效果,PS图

图象处理,软件设计,红葡萄酒,特殊效果,美丽,设计与客户沟通是非常重要的,清楚了解客户的要求;然后上网参考一些优秀的作品,寻找灵感;然后收集材料;最后是纹理效果,设计为 设计与客户沟通是非常重要的,清楚了解客户的要求;然后上网参考一些优秀的作…

2015超级搞笑QQ签名

2015超级搞笑QQ签名

超级搞笑,电脑软件,QQ,恐怕我的黑眼圈暴露了我的国宝身份。 不要浪费青春。 女商人不懂她们的恨,所有的功课。 我不想减肥。我只是害怕反弹。 我没有心脏病,但我的心脏断了,医生,这能治好吗; 尘归尘,土归土,挥手告别二百五十。 之所以把花放在牛粪…

如何在透明层锁定PS不被编辑

如何在透明层锁定PS不被编辑

锁定,不被,编辑,如何在,电脑软件,如何在透明层锁定PS不被编辑有时候PS需要编辑透明层,但是你怎么处理不可编辑的透明图层呢如果发生这种情况,该层通常是锁定的,让我们看看结果。 有时我们只使用软件打开一个透明的图层来编辑,它会显示出这种方…

如何提高手机的速度QQ常见问题

如何提高手机的速度QQ常见问题

常见问题,速度,电脑软件,QQ,提高手机速度的方法:进入手机管理器=手机正在加速,点击一键加速 移动加速包含以下内容: 1,一键加快你清理手机缓存,结束额外的进程,优化开机启动项,为你加快手机的速度。 2,手机加速功能还提供手动操作,其中进程管理可…

什么permutExcel函数是Excel

什么permutExcel函数是Excel

函数,电脑软件,permutExcel,Excel,Excel的permut函数是返回一个数字的排列,从中选择一定数量的对象的一组对象的对象的数量。任意设置或对象或安排在一个内部秩序的事件的子集。安排不同的组合,组合的内部秩序是毫无意义的。这个功能可用于概…

Javascript通过原型将属性使用实例定义为

Javascript通过原型将属性使用实例定义为

原型,对象,属性,实例,定义,本文演示了如何使用Javascript通过原型将属性定义为对象,供您参考,具体分析如下: 下面的js代码定义了电影的对象。在使用对象的过程,这iscomedy属性添加到对象的原型,并且使用方便object.iscomedy时直接调用。 功能movieto…

两招教你所有隐藏的文本在微软Word

两招教你所有隐藏的文本在微软Word

教程,文本,教你,两招,电脑软件,当我们工作时,我们会很长时间加密一些秘密文件或隐藏所有的话,这样我们可以保护我们的隐私不被别人看到。 方法一、将所有文字颜色变为白色,以达到隐藏效果。 首先,按Ctrl + A,文本将选择菜单栏,然后打开格式;;字体,…

Javascript在CSS3动画结束判断的CSS3动画

Javascript在CSS3动画结束判断的CSS3动画

动画,回调函数,结束,电脑软件,Javascript,在CSS3的年龄,所有的CSS3动画是可能的--。 传统的js可以根据回调函数判断动画是否完成。即使动画效果是由CSS技术生成的,Javascript仍然可以捕获动画或转换的结束事件。 transitionend事件和animationend…