Biblioteki Javascript AOP [zamknięte]

Jakiej biblioteki JavaScript AOP używasz i jakie są jej kluczowe cechy ?

Author: glmxndr, 2009-06-17

3 answers

Oto co znalazłem do tej pory:

  • implementacja dotvoid , czysta składnia, przyjemna w użyciu, artykuł jest dobrym wstępem na temat dlaczego / jak używać podanego kodu, wspiera wprowadzenie, ale jest podsłuch,
  • Dojo ma coś, co wydaje się być dobrą implementacją wbudowaną w dojox, tutaj jest miłym wprowadzeniem, jak go używać,
  • istnieje plugin do jQuery, jquery-aop, o szorstszej składni, przekazujący obiekty i metody w obiekt javascript,
  • Pointcut jest jednym z najczęściej używanych narzędzi w systemach operacyjnych, takich jak Windows, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X, Mac OS X]}

Jak mówiłem, kod dotvoid nie działa. Trochę poprawiłem i mam coś, co wydaje się działać lepiej:

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;
        }
}
 30
Author: glmxndr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-17 14:16:28

Czy widziałeś meld.js i aop.js z https://github.com/cujojs ?

SpringSource zapewnia tam funkcjonalność AOP, oprócz kilku innych przydatnych rzeczy dla zaawansowanych programistów Javascript.

Disclaimer: pracuję dla SpringSource.

 13
Author: Pieter Humphrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 21:44:31

Na bazie rozwiązania dotvoid stworzyłem własną wersję JS AOP na potrzeby własnych projektów. W zasadzie chcę zminimalizować koszty konfiguracji aspect, więc dodałem funkcjonalność konfiguracji aspect w Funkcja.prototyp.

Function.prototype.applyBefore = function (aspect, targetFuncNames) {
....
}

Potrzebuję również obsługi wywołań zwrotnych aync, takich jak obsługa uwierzytelniania i autoryzacji dla niektórych metod. Na przykład:

var authenticateAspect = function (error, success, context, args) {
    logger.log('authenticate (applyBefore async) aspect is being called');
    var request = $.ajax({
        url: "http://localhost/BlogWeb/api/user/authenticate",
        type: "GET",
        data: { username:'jeff', pwd:'jeff' },
        success: function (data) {
            if (data) {
                success();
            } else {
                error();
            }
        },
        error: error
    });
    return request;
};

Person.applyBefore(authenticateAspect, 'sendNotification');

var p1 = new Person();

p1.sendNotification();

Aby to wdrożyć, muszę uruchomić zabezpieczenia i kontynuować po sukcesie lub zatrzymać wykonanie na porażka.

var invalidAspect = new Error("Missing a valid aspect. Aspect is not a function."),
    invalidMethod = new Error("Missing valid method to apply aspect on.");

///Parameters: aspect - defines the methods we want call before or/and 
///             after each method call ob target obejct
///            targetFuncNames - target function names to apply aspects
///Return: it should return a new object with all aspects setup on target object
Function.prototype.applyBefore = function (aspect, targetFuncNames) {
    if (typeof (aspect) != 'function')
        throw invalidAspect;

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

    var targetObj = this;
    //error handling function

    // Copy the properties over onto the new prototype
    for (var i = 0, len = targetFuncNames.length; i < len; i++) {
        var funcName = targetFuncNames[i];
        var targetFunc = targetObj.prototype[funcName];

        if (!targetFunc)
            throw invalidMethod;


        targetObj.prototype[funcName] = function () {
            var self = this, args = arguments;
            var success = function() {
                return targetFunc.apply(self, args);
            };
            var error = function () {
                logger.log('applyBefore aspect failed to pass');
                //log the error and throw new error
                throw new Error('applyBefore aspect failed to pass');
            };

            var aspectResult = aspect.apply(null, Array.prototype.concat([error, success, self], args));
            return aspectResult;
        };
    }
};

Pełna implementacja znajduje się na stronie http://www.jeffjin.net/aop-with-javascript

 3
Author: Jeff Jin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-21 04:20:23