【发布时间】:2017-03-22 16:30:36
【问题描述】:
这很容易(对于 90% 的 aop 功能)无需任何语言本身的支持,就像在大多数动态语言(如 python 和 ruby)中一样。但是,Dojo 在1.3.2 上直接支持它。最新版本发生了什么?他们删除了吗?
还有其他应该引起更多关注的 javascript aop 库吗?
【问题讨论】:
标签: javascript dojo aop
这很容易(对于 90% 的 aop 功能)无需任何语言本身的支持,就像在大多数动态语言(如 python 和 ruby)中一样。但是,Dojo 在1.3.2 上直接支持它。最新版本发生了什么?他们删除了吗?
还有其他应该引起更多关注的 javascript aop 库吗?
【问题讨论】:
标签: javascript dojo aop
【讨论】:
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/)仍然是最新的,因此您可以将其用作一般参考。我打算将它迁移到官方参考文档中。
【讨论】:
好吧,你可以试试这些装饰器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
【讨论】:
任何语言都支持 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 装饰器)
我还写了一篇文章来解释这个技巧
【讨论】: