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

时间:2012-06-12 11:26:19

标签: dojo

在实现面向方面的编程时,我感到很困惑 为什么Dojo必须有两个不同的库文件?

何时使用

dojo.aspect and dojox.lang.aspect ?

2 个答案:

答案 0 :(得分:3)

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

你可以在作者Eugene Lazutkin撰写的文章中找到dojox.lang.aspect存在的原因:AOP aspect of JavaScript with Dojo

  

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

     

[...]

     

总结一下:事件!= AOP。事件无法模拟AOP的所有方面,并且AOP不能用于代替事件。

     

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

     
      
  • 将每个建议作为一项功能实施是昂贵的。   
        
    • 通常迭代比递归调用更有效。
    •   
    • 调用堆栈的大小有限。
    •   
    • 如果我们有链接电话,就不可能重新安排它们。因此,如果我们想在中间删除一条建议,我们就不走运了。
    •   
    • “around”建议将“吃掉”所有之前附加的“之前”和“之后”建议,以改变其执行顺序。我们不能再保证“所有”建议在所有“周围”建议之前运行,等等。
    •   
  •   
  • 通常为了将“around”建议与原始函数分离,使用proceed()函数。调用它将导致调用next-in-chain around advice方法或原始方法。
  •   
  • 我们的方面是一个对象,但在某些情况下我们希望它是一个静态对象,在其他情况下,我们希望它是一个动态对象,考虑到我们操作对象的状态而创建。
  •   
     

dojox.lang.aspect解决了这些问题和其他一些问题(目前在主干中,将在Dojo 1.2中发布)。

从最新的Dojo 1.7开始,很有可能区分事件方面,即dojo/ondojo/aspect之间(两者都是在dojo.connect之前实现的。

答案 1 :(得分:2)

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

另一方面,(TMHO)只有dojox / lang / aspect提供了足够的功能来玩aop。 它允许您使用正则表达式定义切入点,因此允许“为名称以任何对象开头的任何函数执行一个建议”...

您甚至可以传入一系列函数名称或正则表达式,以应用您的方面。

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