最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript AOP編程實例

 更新時間:2015年06月16日 14:58:48   作者:紅薯  
這篇文章主要介紹了JavaScript AOP編程,實例分析了javascript實現(xiàn)AOP編程的基本技巧,需要的朋友可以參考下

本文實例講述了JavaScript AOP編程。分享給大家供大家參考。具體如下:

/*
// aop({options});
// By: adamchow2326@yahoo.com.au
// Version: 1.0
// Simple aspect oriented programming module
// support Aspect before, after and around
// usage:
    aop({
      context: myObject,   // scope context of the target function.
      target: "test",     // target function name
      before: function() {  // before function will be run before the target function
        console.log("aop before");
      },
      after: function() {   // after function will be run after the target function
        console.log("aop after");
      },
      around: function() {  // around function will be run before and after the target function
        console.log("aop around");
      }
    });
*/
var aop = (function() {
  var options = {},
    context = window,
    oFn,
    oFnArg,
    targetFn,
    targetFnSelector,
    beforeFn,
    afterFn,
    aroundFn,
    cloneFn = function(Fn) {
      if (typeof Fn === "function") {
        return eval('[' +Fn.toString()+ ']')[0];
      }
      return null;
    },
    checkContext = function() {
      if (options.context) {
        context = options.context;
      }
      if (typeof context[(options.target).name] === "function") {
        targetFnSelector = (options.target).name;
        targetFn = context[targetFnSelector];
      }
      else if (typeof context[options.target] === "function") {
        targetFnSelector = options.target;
        targetFn = context[targetFnSelector];
      }
      if (targetFn) {
        oFn = cloneFn(targetFn);
        oFnArg = new Array(targetFn.length);
        return true;
      }
      else {
        return false;
      }
    },
    run = function() {
      context[targetFnSelector] = function(oFnArg) {
        if (aroundFn){
          aroundFn.apply(this, arguments);
        }
        if (beforeFn){
          beforeFn.apply(this, arguments); // 'this' is context
        }
        oFn.apply(this, arguments);
        if (afterFn){
          afterFn.apply(this, arguments); // 'this' is context
        }
        if (aroundFn){
          aroundFn.apply(this, arguments);
        }
      };
    };
  return function(opt){
    if (opt && typeof opt === "object" && !opt.length) {
      options = opt;
      if (options.target && checkContext()) {
        if (options.before && typeof options.before === "function") {
          beforeFn = options.before;
        }
        if (options.after && typeof options.after === "function") {
          afterFn = options.after;
        }
        if (options.around && typeof options.after === "function") {
          aroundFn = options.around;
        }
        run();
      }
    }
  };
})();
// test examples
// ----------------- aop modify global function ---------------//
function test(name, age) {
  console.log("test fn. name = " + name + " age: " + age);
}
aop({
  target: "test",
  before: function() {
    console.log("aop before");
  },
  after: function() {
    console.log("aop after");
  },
  around: function() {
    console.log("aop around");
  }
});
// run
test("adam", 6);
// ----------------- aop test modify method in an object ---------------//
var myobj = {
  myName: "testName",
  sayName: function() {
    console.log(this.myName);
  },
  childObj: {
    age: 6,
    say: function() {
      console.log(this.age);
    }
  }
};
aop({
  context: myobj,
  target: "sayName",
  before: function() {
    console.log("aop before say name = " + this.myName);
  },
  after: function() {
    console.log("aop after say name = " + this.myName);
  },
  around: function() {
    console.log("aop around say name = " + this.myName);
  }
});
// run
myobj.sayName();
aop({
  context: myobj.childObj,
  target: "say",
  before: function() {
    console.log("aop before say name = " + this.age);
  },
  after: function() {
    console.log("aop after say name = " + this.age);
  },
  around: function() {
    console.log("aop around say name = " + this.age);
  }
});
myobj.childObj.say();

希望本文所述對大家的javascript程序設(shè)計有所幫助。

相關(guān)文章

  • 關(guān)于json字符串與實體之間的嚴(yán)格驗證代碼

    關(guān)于json字符串與實體之間的嚴(yán)格驗證代碼

    在一個項目中要求嚴(yán)格驗證傳入的json字符串與定義的 類匹配,否則不記錄。后來查了好多資料才弄明白,下面小編給大家分享下關(guān)于json字符串與實體之間的嚴(yán)格驗證,感興趣的朋友一起看看吧
    2016-11-11
  • javascript事件監(jiān)聽與事件委托實例詳解

    javascript事件監(jiān)聽與事件委托實例詳解

    這篇文章主要介紹了javascript事件監(jiān)聽與事件委托,結(jié)合實例形式詳細分析了javascript事件監(jiān)聽與事件委托相關(guān)原理、用法與操作注意事項,需要的朋友可以參考下
    2019-08-08
  • JavaScript中的undefined學(xué)習(xí)總結(jié)

    JavaScript中的undefined學(xué)習(xí)總結(jié)

    這篇文章主要是對JavaScript中的undefined進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • 淺談JavaScript 聲明提升

    淺談JavaScript 聲明提升

    這篇文章主要介紹了JavaScript 聲明提升的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下
    2020-09-09
  • 使用getBoundingClientRect方法實現(xiàn)簡潔的sticky組件的方法

    使用getBoundingClientRect方法實現(xiàn)簡潔的sticky組件的方法

    本文介紹這種組件的實現(xiàn)思路,并提供一個同時支持將sticky元素固定在頂部或底部的具體實現(xiàn),由于這種組件在網(wǎng)站中非常常見,所以有必要掌握它的實現(xiàn)方式,以便在有需要的時候基于它的思路寫出功能更多的組件出來
    2016-03-03
  • get(0).tagName獲得作用標(biāo)簽示例代碼

    get(0).tagName獲得作用標(biāo)簽示例代碼

    get(0).tagName可獲得作用標(biāo)簽,下面是它的一個小應(yīng)用,在學(xué)習(xí)js的朋友可以參考下
    2014-10-10
  • Js實現(xiàn)兩個跨域頁面進行跳轉(zhuǎn)傳參的方案詳解

    Js實現(xiàn)兩個跨域頁面進行跳轉(zhuǎn)傳參的方案詳解

    這篇文章主要為大家詳細介紹了JavaScript中實現(xiàn)兩個跨域頁面進行跳轉(zhuǎn)傳參的方案,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • js如何給json對象添加、刪除、修改屬性

    js如何給json對象添加、刪除、修改屬性

    這篇文章主要介紹了js如何給json對象添加、刪除、修改屬性問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 如何用RxJS實現(xiàn)Redux Form

    如何用RxJS實現(xiàn)Redux Form

    這篇文章主要介紹了如何用RxJS實現(xiàn)Redux Form,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • layer 關(guān)閉指定彈出層的例子

    layer 關(guān)閉指定彈出層的例子

    今天小編就為大家分享一篇layer 關(guān)閉指定彈出層的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09

最新評論

新津县| 凌海市| 静海县| 泰来县| 乌兰察布市| 沛县| 东辽县| 东源县| 旌德县| 新营市| 资中县| 太原市| 玉山县| 祁连县| 涿鹿县| 奉化市| 安宁市| 松桃| 阿拉善右旗| 阿尔山市| 旺苍县| 惠水县| 弥勒县| 都匀市| 新丰县| 辽宁省| 房产| 永川市| 怀集县| 定远县| 黄骅市| 隆林| 郴州市| 武安市| 桐柏县| 开原市| 开阳县| 萝北县| 恩平市| 宝山区| 泸定县|