【问题标题】:Javascript AOP supportJavascript AOP 支持
【发布时间】:2017-03-22 16:30:36
【问题描述】:

这很容易(对于 90% 的 aop 功能)无需任何语言本身的支持,就像在大多数动态语言(如 python 和 ruby​​)中一样。但是,Dojo1.3.2 上直接支持它。最新版本发生了什么?他们删除了吗?

还有其他应该引起更多关注的 javascript aop 库吗?

【问题讨论】:

    标签: javascript dojo aop


    【解决方案1】:

    鉴于 Javascript 中可用的灵活语法糖果,我想那里会有十亿个 AOP 库。

    通过 Google 快速搜索得到以下结果:

    ...还有另一个Stackoverflow question

    【讨论】:

      【解决方案2】:

      dojox.lang.aspect 仍然存在,仍然被严肃的项目使用。没有人删除它。事实上,我希望它的一部分将成为即将到来的 Dojo 2.0 的重要组成部分。

      您提出问题的原因是什么?找不到一些链接,还是其他原因?请告诉我,我会帮忙的。

      更新:

      API 文档链接:http://dojotoolkit.org/api/dojox/lang/aspect.html

      我关于 AOP 的博客文章的链接(在您的问题中列出:http://lazutkin.com/blog/2008/may/18/aop-aspect-javascript-dojo/)仍然是最新的,因此您可以将其用作一般参考。我打算将它迁移到官方参考文档中。

      【讨论】:

      • 在最新的文档中找不到。这让它看起来像是被遗弃了。
      • 当然不是。我将调查文档问题。现在我正在将 API 文档链接添加到我的答案中。
      • 太棒了。如果它在 dojo 之外作为单独的库提供会更好,但是在 Nodejs 之外的 javascript 项目通常不会将模块化作为一个大问题。
      • Dojo 最初被设想为一个库库。它仍然显示。对于 Dojo 2.0,我们正在研究一种通用的模块和包格式,可以被其他项目采用。所以你的愿望可能会实现。 ;-)
      • OTOH 没有人阻止其他开发人员将 Dojo 的任何部分移植到其他库或将其转换为独立的。这绝对是可能的,并不像某些人想象的那样难。
      【解决方案3】:

      好吧,你可以试试这些装饰器https://www.npmjs.com/package/ng-aspect,它们为 TypeScript (ES2015/2016) 带来真正的 AOP 体验。看看这段代码

      import { Before, After, Pointcut } from "./aspect";
      
      class Foo {
        @Pointcut
        bar(){
          console.log( "calling bar", arguments );
        }
      }
      
      class Advice {
        @Before( Foo, "bar" )
        preLog() {
          console.log( "calling pre-log", arguments );
        }
      
        @After( Foo, "bar" )
        postLog() {
          console.log( "calling post-log" );
        }
      }
      
      (new Foo()).bar( 1, 2, 3 );
      
      // calling pre-log 1,2,3
      // calling bar 1,2,3
      // calling post-log
      

      【讨论】:

        【解决方案4】:

        任何语言都支持 AOP,因为它是一种技术,你应该自己实现它。

        ES7 装饰器非常适合 AOP 语法,但无需使用 typescript 即可获得真正的 AOP 体验。甚至 ES5 也能做到:

        var Class = require("kaop").Class;
        
        var Dummy = Class({
          someMethod: [ //decoratedMethod
            "subscribe","$inject", //befores
             function($$dep1){ 
               //method body 
             }, 
             "trigger: 'action'", //afters (advice with an argument) 
          ],
          anotherMethod: function(){
            /* method without advices */
          }
        })
        

        我建议你查看我最近的工作,它实现了顶级 AOP 功能,甚至是异步调用

        https://github.com/k1r0s/kaop https://github.com/k1r0s/kaop-ts (Alpha)(如果你喜欢 ES7 装饰器)

        我还写了一篇文章来解释这个技巧

        https://medium.com/@k1r0s/aspect-oriented-programming-in-javascript-es5-typescript-d751dda576d0#.3d04ziock

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 2013-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多