Javascript AOP 库 [关闭]

2024-02-25

您使用哪个 Javascript AOP 库?它的主要功能是什么?


这是我到目前为止发现的:

  • dotvoid http://www.dotvoid.com/2005/06/aspect-oriented-programming-and-javascript/的实现,干净的语法,很好用,这篇文章很好地介绍了为什么/如何使用给定的代码,支持介绍,但有bug,
  • Dojo 似乎有一个很好的内置实现dojox http://api.dojotoolkit.org/jsdoc/1.3/dojox.lang.aspect, here http://lazutkin.com/blog/2008/may/18/aop-aspect-javascript-dojo/关于如何使用它的一个很好的介绍,
  • 有一个 jQuery 插件,jquery-aop http://code.google.com/p/jquery-aop/,使用更粗糙的语法,在 javascript 对象中传递对象和方法,
  • AspectJS http://zer0.free.fr/aspectjs/aspectjs.js使用更粗糙的语法(需要将切入点类型作为参数传递给单个方法)

就像我说的,dotvoid 的代码不起作用。 我纠正了一点,得到了一些似乎效果更好的东西:

InvalidAspect = new Error("Missing a valid aspect. Aspect is not a function.");
InvalidObject = new Error("Missing valid object or an array of valid objects.");
InvalidMethod = new Error("Missing valid method to apply aspect on.");

function doBefore(beforeFunc,func){
    return function(){
        beforeFunc.apply(this,arguments);
        return func.apply(this,arguments);
    };  
}

function doAfter(func, afterFunc){
    return function(){
        var res = func.apply(this,arguments);
        afterFunc.apply(this,arguments);
        return res;   
    };
}

Aspects = function(){};
Aspects.prototype={
    _addIntroduction : function(intro, obj){
         for (var m in intro.prototype) {
              obj.prototype[m] = intro.prototype[m];
            }
        },

    addIntroduction : function(aspect, objs){
        var oType = typeof(objs);

        if (typeof(aspect) != 'function')
        throw(InvalidAspect);

        if (oType == 'function'){
            this._addIntroduction(aspect, objs);
        }
        else if (oType == 'object'){
            for (var n = 0; n < objs.length; n++){
                this._addIntroduction(aspect, objs[n]);
            }
        }
        else{
            throw InvalidObject;
        }
    },

    addBefore : function(aspect, obj, funcs){
          var fType = typeof(funcs);

          if (typeof(aspect) != 'function')
            throw(InvalidAspect);

          if (fType != 'object')
            funcs = Array(funcs);

          for (var n = 0; n < funcs.length; n++){
            var fName = funcs[n];
            var old = obj.prototype[fName];

            if (!old)
              throw InvalidMethod;

            var res = doBefore(aspect,old)
            obj.prototype[fName] = res;
        }
    },

    addAfter : function(aspect, obj, funcs) {
          if (typeof(aspect) != 'function')
            throw InvalidAspect;

          if (typeof(funcs) != 'object')
            funcs = Array(funcs);

          for (var n = 0; n < funcs.length; n++)
          {
            var fName = funcs[n];
            var old = obj.prototype[fName];

            if (!old)
              throw InvalidMethod;

            var res = doAfter(old,aspect);
            obj.prototype[fName] = res;
          }
        },

    addAround : function(aspect, obj, funcs){
          if (typeof(aspect) != 'function')
            throw InvalidAspect;

          if (typeof(funcs) != 'object')
            funcs = Array(funcs);

          for (var n = 0; n < funcs.length; n++)
          {
            var fName = funcs[n];
            var old = obj.prototype[fName];
            if (!old)
              throw InvalidMethod;

            var res = aspect(old);
            obj.prototype[fName] = res;
          }

          return true;
        }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript AOP 库 [关闭] 的相关文章

随机推荐

  • 将代码添加到 C# 属性获取/设置而不需要支持字段?

    您知道如何拥有自动生成支持字段的属性吗 就像我去的话 public String SomeProperty get set 我知道 如果我想向该属性添加代码 我必须创建支持字段 如下所示 public string someProperty
  • 动态应用程序级资源在 ElementHost 中托管时不是动态的

    我在 WinForms 容器中托管 WPF UserControl 现在 我希望能够为 UserControl 设置主题 皮肤 为此 我有几个定义 皮肤 的资源字典 当我的应用程序启动时 我创建一个 new System Windows A
  • vue 上下文中的 getElementsByClassName

    在 vue js 的上下文中 getElementsByClassName 是如何工作的 我有下面的代码片段 目标是单击按钮并使用 vue js 方法将 h1 标签的颜色更改为绿色 div h1 class main header mess
  • 在 Spring 中启用 WebSocket 的跨源请求

    我有一个 OpenShift Wildfly 服务器 我正在建立一个网站Spring MVC框架 我的一个网页也使用 WebSocket 连接 在服务器端 我使用了 ServerEndpoint注释和javax websocket 库来创建
  • 无法使用xampp控制面板安装Tomcat

    我按照以下步骤成功安装了 xampp v3 2 1JetBrains 指南 http confluence jetbrains com display PhpStorm Installing and Configuring XAMPP wi
  • 在 JavaScript 中增加变量的其他方法[重复]

    这个问题在这里已经有答案了 可能的重复 为什么在 JavaScript 中避免递增 和递减 运算符 https stackoverflow com questions 971312 why avoid increment and decre
  • 调用deleteRowsAtIndexPaths时,具有自动调整单元格大小的UITableView变得不稳定

    我有一个带有自动调整单元格大小的 UITableView 表包含 1 个部分和一些行 我有一些行说 30 我想在期间删除行didSelectRowAtIndexPath 当我删除 tableview 底部附近的可用行 例如第 28 行 时
  • 为 Ruby 编写模块

    如何为 ruby 编写模块 在Python中你可以使用 module py def helloworld name print Hello s name main py import module module helloworld Jim
  • Dj Rest Auth 自定义注册不起作用

    I am using DJ REST AUTH for user registration API I want the first name and last name to show in the API endpoint howeve
  • 仅在没有错误的情况下编译 TeX 源并启动 PDF 的 Vim 脚本

    我正在改用 Vim 作为我的 LaTeX 编辑环境 我希望能够从 Vim 中解析源文件 并在编译成功时启动外部查看 我了解 Vim Latex 套件 但是 如果可能的话 我宁愿避免使用它 它相当重量级 劫持了lot我的钥匙 并且用大量文件弄
  • mysql 计入 PHP 变量

    假设我们有以下查询 SELECT DISTINCT COUNT users id FROM users table 此查询将返回表中的用户数量 我需要将此值传递给 PHP 变量 我正在使用这个 sql result mysql query
  • C#从串口读取数据

    我正在尝试从串行端口读取数据 数据脱离了规模 我首先发送一个命令来开始读取秤 serialPort Write P 然后等了一段时间后我尝试使用 temp2 serialPort ReadLine 应用程序挂在这行代码处 我也尝试过 Rea
  • Unix 域套接字如何区分多个客户端?

    TCP 具有元组对 IP 地址 端口 类型 来区分一个客户端和另一个客户端 UDP 传递客户端 IP 和端口 unix 域如何跟踪不同的客户端 换句话说 服务器创建一个绑定到某个路径 例如 tmp socket 的套接字 2 个或更多客户端
  • 使用 htaccess 禁止文本文件中的 IP [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我阅读并理解了如何使用 htaccess 阻止 ip order deny allow deny from 111 222 33 44
  • 使用 OAuth 通过本机客户端 (.Net) 访问受保护的 Google Apps 脚本 Web 服务

    我的 Net 客户端应用程序 Winform 允许用户使用浏览器控件在 Google 上进行身份验证 我能够在响应中检索 access token 我按照说明进行操作here https developers google com acco
  • Scala 2.10 中验证和扩展构造函数参数的最佳方法

    我想要一个具有许多字段 例如字符串 布尔值等 的类 并且在构造该类时 我想要一个与每个字段关联的字段名并验证该字段 使用字符串的正则表达式 理想情况下 我只想在构造函数中指定参数需要满足某些条件 一些示例代码 case class Data
  • 我可以在 bash shell 中对变量进行 for 循环吗?

    我正在学习 shell 我希望能够循环一些变量 我似乎找不到任何地方有人这样做过 所以我不确定这是否可能 基本上我只是想通过对每个变量使用相同的 sed 命令来省去自己的麻烦 但是该代码显然不起作用 我的问题是 是否可以循环变量 如果不能循
  • PHPExcel - 图表渲染和加载 Excel 给出错误

    require once PHPExcel 1 7 7 Classes PHPExcel php inputFileName RN Tracker xlsx inputFileType PHPExcel IOFactory identify
  • 将此 cURL 转换为 Guzzle

    我尝试阅读 Guzzle 文档 但我无法解决这个问题 我想使用 Guzzle 而不是 cURL 来执行以下操作 protected url https secure abcdef com cgi xml request server php
  • Javascript AOP 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪个 Javascript AOP 库 它的主要功能是什么 这是我到目前为止发现的 dotvoid