国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js 支持 Aspect 切面編程

zhaot / 1940人閱讀

摘要:在方法執(zhí)行后,再執(zhí)行函數(shù)函數(shù)在執(zhí)行時(shí),接收的參數(shù)第一個(gè)是的返回值,之后的參數(shù)和傳給相同。的返回值源碼定義兩個(gè)出口定義一個(gè)可柯里化的函數(shù),柯里化成函數(shù)指向基于生成的類的實(shí)例,如上例的如果該函數(shù)是第一次切面化綁定,則包裝該函數(shù)。

系列文章:讀 arale 源碼之 class 篇

使用 Aspect,可以允許你在指定方法執(zhí)行的前后插入特定函數(shù)

before object.before(methodName, callback, [context])

在 object[methodName] 方法執(zhí)行前,先執(zhí)行 callback 函數(shù).

callback 函數(shù)在執(zhí)行時(shí),接收的參數(shù)和傳給 object[methodName] 相同。

dialog.before("show", function(a, b) {
    a; // 1
    b; // 2
});

dialog.show(1, 2)
after object.after(methodName, callback, [context])

在 object[methodName] 方法執(zhí)行后,再執(zhí)行 callback 函數(shù).

callback 函數(shù)在執(zhí)行時(shí),接收的參數(shù)第一個(gè)是 object[methodName] 的返回值,之后的參數(shù)和傳給 object[methodName] 相同。

dialog.after("show", function(returned, a, b) {
  returned; // show 的返回值
    a; // 1
    b; // 2
});

dialog.show(1, 2);
源碼

定義兩個(gè)出口

exports.before = function(methodName, callback, context) {
    return weave.call(this, "before", methodName, callback, context);
};

exports.after = function(methodName, callback, context) {
    return weave.call(this, "after", methodName, callback, context);
};

定義一個(gè)可柯里化的函數(shù) weave,柯里化成 after、before 函數(shù)

function weave(when, methodName, callback, context) {
    var names = methodName.split(/s+/);
    var name, method;
    while (name = names.shift()) {
      // this 指向基于 Base 生成的類的實(shí)例,如上例的 dialog
    method = getMethod(this, name);
    // 如果該函數(shù)(show)是第一次切面化綁定,則包裝該函數(shù)。
    // 被包裝的函數(shù)在執(zhí)行前后都會觸發(fā)下面注冊的事件。
    if (!method.__isAspected) {
      wrap.call(this, name);
    }
    // 注冊事件:例如 after:show 、 before:show .
    this.on(when + ":" + name, callback, context);
  }
  return this;
}

如果沒有在實(shí)例中找到該方法(show),則拋出異常。

// 在實(shí)例中查找該方法,若沒有則拋出異常
function getMethod(host, methodName) {
    var method = host[methodName];
    if (!method) {
    throw new Error("Invalid method name: " + methodName);
  }
  return method;
}

定義一個(gè)包裝器函數(shù),被包裝的函數(shù)在執(zhí)行前后(before、after)都會觸發(fā)一個(gè)特定的函數(shù)

// 包裝器,使該函數(shù)(show)支持切面化
function wrap(methodName) {
  // 保存舊的方法,this 指向該對象(dialog)
    var old = this[methodName];
    // 定義新的方法,并在舊方法之前觸發(fā) before 綁定的函數(shù),之后觸發(fā) after 綁定的函數(shù)
    this[methodName] = function() {
    var args = Array.prototype.slice.call(arguments);
    var beforeArgs = ["before:" + methodName].concat(args);
    // 觸發(fā) before 綁定的函數(shù),如果返回 false 則阻止原函數(shù) (show) 執(zhí)行
    if (this.trigger.apply(this, beforeArgs) === false) return;
    // 執(zhí)行舊的函數(shù),并將返回值當(dāng)作參數(shù)傳遞給 after 函數(shù)
    var ret = old.apply(this, arguments);
    var afterArgs = ["after:" + methodName, ret].concat(args);
    // 觸發(fā) after 綁定的函數(shù),綁定的函數(shù)的第一個(gè)參數(shù)是舊函數(shù)的返回值
    this.trigger.apply(this, afterArgs);
    return ret;
  }
  // 包裝之后打個(gè)標(biāo)記,不用再重復(fù)包裝了
  this[methodName].__isAspected = true;
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/78207.html

相關(guān)文章

  • Spring核心 面向切面 AOP

    摘要:下圖展示了這些概念的關(guān)聯(lián)方式通知切面的工作被稱為通知。切面在指定的連接點(diǎn)被織入到目標(biāo)對象中。該注解表明不僅僅是一個(gè),還是一個(gè)切面。 在軟件開發(fā)中,散布于應(yīng)用中多處的功能被稱為橫切關(guān)注點(diǎn)(crosscutting concern)。通常來講,這些橫切關(guān)注點(diǎn)從概念上是與應(yīng)用的業(yè)務(wù)邏輯相分離的(但是往往會直接嵌入到應(yīng)用的業(yè)務(wù)邏輯之中)。把這些橫切關(guān)注點(diǎn)與業(yè)務(wù)邏輯相分離正是面向切面編程(AOP...

    Winer 評論0 收藏0
  • 面向復(fù)雜應(yīng)用,Node.js中的IoC容器 -- Rockerjs/core

    摘要:項(xiàng)目地址項(xiàng)目主頁基于和注解的輕量級容器,提供了依賴注入面向切面編程及異常處理等功能。可在任意工程中引入,是一個(gè)框架無關(guān)的容器。模塊不依賴于任何框架,并與現(xiàn)有框架庫類等保持兼容。 Rockerjs Core 項(xiàng)目地址 項(xiàng)目主頁 基于 TypeScript 和注解的輕量級IoC容器,提供了依賴注入、面向切面編程及異常處理等功能。Rockerjs Core可在任意工程中引入,是一個(gè)框架無...

    jasperyang 評論0 收藏0
  • 面向復(fù)雜應(yīng)用,Node.js中的IoC容器 -- Rockerjs/core

    摘要:項(xiàng)目地址項(xiàng)目主頁基于和注解的輕量級容器,提供了依賴注入面向切面編程及異常處理等功能。可在任意工程中引入,是一個(gè)框架無關(guān)的容器。模塊不依賴于任何框架,并與現(xiàn)有框架庫類等保持兼容。 Rockerjs Core 項(xiàng)目地址 項(xiàng)目主頁 基于 TypeScript 和注解的輕量級IoC容器,提供了依賴注入、面向切面編程及異常處理等功能。Rockerjs Core可在任意工程中引入,是一個(gè)框架無...

    Kosmos 評論0 收藏0
  • 慕課網(wǎng)_《Spring入門篇》學(xué)習(xí)總結(jié)

    摘要:入門篇學(xué)習(xí)總結(jié)時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時(shí)間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://git...

    Ververica 評論0 收藏0
  • AOP的簡單實(shí)現(xiàn)

    摘要:要實(shí)現(xiàn)的功能,無非就是把兩個(gè)部分串聯(lián)起來切面切點(diǎn)只要一個(gè)類的方法中含有切點(diǎn),那說明這個(gè)方法需要被代理,插入切面,所以相應(yīng)的就需要產(chǎn)生代理類。代碼實(shí)現(xiàn)作為準(zhǔn)備工作,首先我們定義相應(yīng)的注解類是類注解,表明這是一個(gè)切面類,包含了切面函數(shù)。 之前一篇文章分析了Java AOP的核心 - 動態(tài)代理的實(shí)現(xiàn),主要是基于JDK Proxy和cglib兩種不同方式。所以現(xiàn)在干脆把這個(gè)專題做完整,再造個(gè)簡...

    Andrman 評論0 收藏0

發(fā)表評論

0條評論

zhaot

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<