1. Введение
АОП (Аспектно-ориентированное программирование) означает Аспектно-ориентированное программирование, технологию, реализующую унифицированное обслуживание программных функций с помощью прекомпиляции и динамических агентов во время выполнения. АОП является продолжением ООП и производным от функционального программирования.АОП может использоваться для изоляции различных частей бизнес-логики, тем самым уменьшая связь между различными частями бизнес-логики, улучшая возможность повторного использования программы и повышая эффективность разработки.
2. Базовая реализация
Студенты, которые использовали java spring, должны знать, что существует три типа уведомлений:before
(предварительное объявление),after
(пост-уведомление),around
(объемное уведомление).
Ниже мы реализуем эти три уведомления, когда js вызывает метод:
до (предварительное уведомление)
Как следует из названия, он выполняется перед вызовом функции
Function.prototype.before = function (beforefun) {
var _orgin = this; // 保存原函数引用
return function () { // 返回包含了原函数和新函数的"代理函数"
beforefun.apply(this, arguments); // 执行新函数,修正this
return _orgin.apply(this, arguments); // 执行原函数
}
};
var originFun = function(val){
console.log('原型函数: '+val);
}
var newFun = originFun.before(function(){
// 传入函数调用前处理方法
console.log('before: ' + new Date().getTime())
})
newFun("测试前置通知");
// 调用结果
// before: 1557047939699
// 原型函数: 测试前置通知
после (опубликовать уведомление)
В отличие от предыдущего, выполняется после вызова функции
Function.prototype.after = function (afterfun) {
var _orgin = this; // 保存原函数引用
return function () { // 返回包含了原函数和新函数的"代理函数"
var ret = _orgin.apply(this, arguments); // 执行原函数
afterfun.apply(this, arguments); // 执行新函数,修正this
return ret;
}
};
var originFun = function(val){
console.log('原型函数: '+val);
}
var newFun = originFun.after(function(){
// 传入函数调用前处理方法
console.log('after: ' + new Date().getTime())
})
newFun("测试后置通知");
// 调用结果
// 原型函数: 测试前置通知
// after: 1557047997647
вокруг (объемное уведомление)
Выполнять до и после выполнения метода
// 利用前面的before、after方法实现
Function.prototype.around = function(beforeFun, afterFun) {
var _orgin = this;
return function() {
return _orgin.before(beforeFun).after(afterFun).apply(this, arguments);
}
}
3. АОП сталкивается с декораторами
JS наконец-то добавил в предложение ES7 функцию декоратора, которая используется для изменения поведения класса, но теперь браузер ее не поддерживает, и для конвертации нужно использовать Babel.Когда АОП комбинируется с декоратором, он будет дать Что мы приносим?
Ведение журнала
За счет комбинации АОП и декоратора очень удобно записывать лог или записывать время выполнения функции
class Person {
@log
say(nick) {
return `hi ${nick}`;
}
}
function log(target, name, decriptor){
var _origin = descriptor.value;
descriptor.value = function(){
console.log(`Calling ${name} with `, argumants);
return _origin.apply(null, arguments);
};
return descriptor;
}
var person = new Person();
person.say('小明');
Определить статус входа пользователя
class User {
@checkLogin
getUserInfo() {
console.log('获取用户信息')
}
}
// 检查用户是否登录
function checkLogin(target, name, descriptor) {
let method = descriptor.value
descriptor.value = function (...args) {
// 校验方法,假设这里可以获取到用户名/密码
if (validate(args)) {
method.apply(this, args)
} else {
console.log('没有登录,即将跳转到登录页面...')
}
}
}
let user = new User()
user.getUserInfo()
4. АОП в React
Типичным примером использования идей АОП в реакции являются компоненты более высокого порядка (HOC), см. следующий пример.
function HOCComp(WrappedComponent){
return class HOC extends Component {
render(){
const newProps = {param: 'HOC'};
return <div>
<WrappedComponent {...this.props} {...newProps}/>
</div>
}
}
}
@HOCComp
class OriginComponent extends Component {
render(){
return <div>这是原始组件{this.props.param}</div>
}
}
В приведенном выше примере новые реквизиты определяются в HOCComp и передаются дочерним компонентам. Мы также можем обработать некоторые реквизиты в компоненте OriginComponent или переупаковать внешний слой OriginComponent. Нет необходимости модифицировать внутренние компоненты, сохраняя функциональную развязку.
5. Резюме
Идеи АОП используются во многих фреймворках и проектах, включая высокоуровневые компоненты React, ведение журналов, проверку входа в систему, промежуточное ПО Redux и т. д. В процессе разработки он должен дополнять ООП для повышения надежности и ремонтопригодности программного обеспечения.
использованная литература