fun-exp
Version:
fun-exp 通过 Function.prototype 对函数对象进行了扩展
100 lines (78 loc) • 3.28 kB
JavaScript
/*
fun-exp v1.0.0
author: 郭斌勇
license: MIT
homepage: https://github.com/GuoBinyong/fun-exp#readme
repository: https://github.com/GuoBinyong/fun-exp
description: fun-exp 通过 Function.prototype 对函数对象进行了扩展
*/
'use strict';
/**
* 增加 前置函数;
* 即:在当前函数(即:目标函数)执行前优先执行的函数 fun
* @param fun : BeforeFun 必须;前置函数;注意:前置函数 返回了类数组中的每一个元素都会被作为 目标函数 的参数输入;如果 前置函数 返回 undefined | null 时,则不会更改目标函数的参数;
* @return Function 返回一个新的函数,该函数已在目标函数前增加了前置函数
*
* 注意:
* - 该方法不会更改原来的函数,而是返回一个更改后的新函数;
*/
Function.prototype.before = function (fun) {
var rawFun = this;
return function () {
// @ts-ignore
var argArr = fun.apply(this, arguments);
if (argArr == null) {
argArr = arguments;
} // @ts-ignore
return rawFun.apply(this, argArr);
};
};
/**
* 增加 后置函数;
* 即:在目标函数执行之后再执行函数 fun
* @param fun : AfterFun 必须;后置函数;注意:目标函数的返回值 会作为 后置函数的第一个参数传入,后置函数的返回值 会作为整个函数最终的返回值
* @return Function 返回一个新的函数,该函数已在目标函数后增加了后置函数
*
* 注意:
* - 该方法不会更改原来的函数,而是返回一个更改后的新函数;
*/
Function.prototype.after = function (fun) {
var rawFun = this;
return function () {
// @ts-ignore
var rawReturn = rawFun.apply(this, arguments); // @ts-ignore
return fun.call.apply(fun, [this, rawReturn].concat(Array.prototype.slice.call(arguments)));
};
};
/**
* 包装目标函数;
* 即:给当前函数(即:目标函数)分别增加 前置函数 before 和 后置函数 after
* @param before ?: BeforeFun 可选;前置函数;注意:前置函数 返回了类数组中的每一个元素都会被作为 目标函数 的参数输入;如果 前置函数 返回 undefined | null 时,则不会更改目标函数的参数;
* @param after ?: AfterFun 可选;后置函数;注意:目标函数的返回值 会作为 后置函数的第一个参数传入,后置函数的返回值 会作为整个函数最终的返回值
* @return Function 返回一个新的函数,该函数已为目标函数增加了 前置函数 和 后置函数
*
* 注意:
* - 该方法不会更改原来的函数,而是返回一个更改后的新函数;
*/
Function.prototype.wrap = function (before, after) {
var rawFun = this;
if (before && after) {
return function () {
var _fun;
// @ts-ignore
var argArr = before.apply(this, arguments);
if (argArr == null) {
argArr = arguments;
} // @ts-ignore
var rawReturn = rawFun.apply(this, argArr); // @ts-ignore
return (_fun = fun).call.apply(_fun, [this, rawReturn].concat(Array.prototype.slice.call(arguments)));
};
}
if (before) {
return rawFun.before(before);
}
if (after) {
return rawFun.after(after);
}
return rawFun;
};