dojo.aspect和dojox.lang.aspect之间的实现区别是什么

dojo.aspect和dojox.lang.aspect之间的实现区别是什么,dojo,Dojo,在实现面向方面编程时,我感到困惑 为什么Dojo需要两个不同的spect库文件 何时使用 dojo.aspect and dojox.lang.aspect ? 我以前从未听说过dojox.lang.aspect,但根据git log到2008年的最新提交日期 您可以在其作者Eugene Lazutkin的一篇文章中找到为什么dojox.lang.aspect存在的解释: 虽然在某些情况下没有多大意义,但我们应该认识到,dojo.connect()的主要作用是处理DOM事件 [……] 总而言之

在实现面向方面编程时,我感到困惑 为什么Dojo需要两个不同的spect库文件

何时使用

dojo.aspect and dojox.lang.aspect ?

我以前从未听说过
dojox.lang.aspect
,但根据
git log
到2008年的最新提交日期

您可以在其作者Eugene Lazutkin的一篇文章中找到为什么
dojox.lang.aspect
存在的解释:

虽然在某些情况下没有多大意义,但我们应该认识到,
dojo.connect()
的主要作用是处理DOM事件

[……]

总而言之:事件!=AOP。事件不能模拟AOP的所有方面,AOP不能代替事件

所以JavaScript中的AOP听起来很简单!实际上有几个棘手的地方:

  • 将每一条建议作为一个函数来实现是非常昂贵的。
    • 通常迭代比递归调用更有效
    • 调用堆栈的大小是有限的
    • 如果我们有连锁电话,就不可能重新安排。所以,如果我们想在中间删除一个建议,我们就不走运了。
    • “周围”通知将“吃掉”所有先前附加的“之前”和“之后”通知,以更改其执行顺序。我们不能再保证“之前”的建议在所有“周围”的建议之前运行,等等
  • 通常,为了将“环绕”通知与原始函数解耦,会使用procedure()函数。调用它将导致调用环链中的下一个advice方法或原始方法
  • 我们的方面是一个对象,但在某些情况下,我们希望它是一个静态对象,在其他情况下,我们希望它是一个动态对象,创建时考虑到我们操作的对象的状态
这些问题和其他一些问题在dojox.lang.aspect中得到了解决(目前在主干中,将在Dojo 1.2中发布)


从最新的Dojo 1.7开始,有一种强烈的倾向来区分事件和方面,即
Dojo/on
Dojo/aspect
(两者都是通过
Dojo.connect
以前实现的)。

我以前从未听说过
dojox.lang.aspect
,但是根据git日志2008年的最新提交日期

您可以在其作者Eugene Lazutkin的一篇文章中找到为什么
dojox.lang.aspect
存在的解释:

虽然在某些情况下没有多大意义,但我们应该认识到,
dojo.connect()
的主要作用是处理DOM事件

[……]

总而言之:事件!=AOP。事件不能模拟AOP的所有方面,AOP不能代替事件

所以JavaScript中的AOP听起来很简单!实际上有几个棘手的地方:

  • 将每一条建议作为一个函数来实现是非常昂贵的。
    • 通常迭代比递归调用更有效
    • 调用堆栈的大小是有限的
    • 如果我们有连锁电话,就不可能重新安排。所以,如果我们想在中间删除一个建议,我们就不走运了。
    • “周围”通知将“吃掉”所有先前附加的“之前”和“之后”通知,以更改其执行顺序。我们不能再保证“之前”的建议在所有“周围”的建议之前运行,等等
  • 通常,为了将“环绕”通知与原始函数解耦,会使用procedure()函数。调用它将导致调用环链中的下一个advice方法或原始方法
  • 我们的方面是一个对象,但在某些情况下,我们希望它是一个静态对象,在其他情况下,我们希望它是一个动态对象,创建时考虑到我们操作的对象的状态
这些问题和其他一些问题在dojox.lang.aspect中得到了解决(目前在主干中,将在Dojo 1.2中发布)


从最新的Dojo 1.7开始,有一种强烈的倾向来区分事件和方面,即
Dojo/on
Dojo/aspect
(两者都是以前通过
Dojo.connect
实现的)。

从使用角度来看,Dojo/aspect是dojox/lang/aspect的一个非常简化的版本。
使用dojo/aspect,您可以创建与命名函数对应的方面(例如,“xhr”类中的“get”方法),允许您在调用xhr.get时创建前后或前后的通知

另一方面,(TMHO)只有dojox/lang/aspect提供了足够的特性来使用aop。 它允许您使用正则表达式定义切入点,因此允许“对名称以get on any object开头的任何函数执行around advice”

您甚至可以传入将应用方面的函数名或正则表达式数组


phusick的博客文章给出了很好的例子。

从使用角度来看,dojo/aspect是dojox/lang/aspect的一个非常简化的版本。
使用dojo/aspect,您可以创建与命名函数对应的方面(例如,“xhr”类中的“get”方法),允许您在调用xhr.get时创建前后或前后的通知

另一方面,(TMHO)只有dojox/lang/aspect提供了足够的特性来使用aop。 它允许您使用正则表达式定义切入点,因此允许“对名称以get on any object开头的任何函数执行around advice”

您甚至可以传入将应用方面的函数名或正则表达式数组

phusick的博客文章给出了很好的例子