-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
前言
OOP
面向对象编程以对象为中心,以类和继承为构造机制,构建相应的软件系统。
OOP的三大特征:
- 封装
- 多态
- 继承
AOP
面向切面编程主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
那么,AOP如何体现?
这里可以联想一下中间件、拦截器,它们都是AOP思想的实践。装饰器模式、代理模式,它们也是基于AOP思想的设计模式。
AOP思想,指导我们通过找到平整切面的形式,插入新的代码,使新插入的代码对切面上下原有流程的伤害降到最低。
装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
AOP实例讲解
如下代码
// AOP 装饰者模式
function test(){
console.log("代码执行")
}
// this 指针在执行阶段确定,谁调用它就指向谁
Function.prototype.before = function(fn) {
// (1)处this
const self = this
return function() {
// (2)处this
fn.apply(this, arguments);
return self.apply(this, arguments);
}
}
Function.prototype.after = function(fn) {
const self = this
return function() {
var ret = self.apply(this, arguments);
fn.apply(this, arguments);
return ret
}
}
执行三种情况分别如下
情况一
test.before(()=>{console.log("代码开始")})()
输出结果
代码开始
代码执行
代码分析
代码中的(1)处this
指向的是test
,因为是test
调用的before
函数,所以谁调用指向谁
(2)处this
指向的是window
,因为test.before(...)
执行完后返回的是function(){...}
,(function(){...})()
执行相当于全局执行所以指向window
情况二
test.after(()=>{console.log("代码结束")})()
输出结果
代码执行
代码结束
代码分析
与情况一同理
情况三
let testfn = test.before(()=>{console.log("代码开始")}).after(()=>{console.log("代码结束")})()
输出结果
代码开始
代码执行
代码结束
代码分析
最后的()
执行的是after(()=>{console.log("代码结束")})
,其执行流程如下
function test(){
console.log("代码执行")
}
// this 指针在执行阶段确定,谁调用它就指向谁
Function.prototype.before = function(fn) {
const self = this
return function() { // 步骤2
fn.apply(this, arguments); // 步骤3,此处执行传入的()=>{console.log("代码开始")函数
return self.apply(this, arguments); // 步骤4,此处self是tree函数,所以执行tree函数
}
}
Function.prototype.after = function(fn) {
const self = this
return function() {
var ret = self.apply(this, arguments); // 步骤1,before中的function调用的after,所以this指向before中的function,所以该步骤执行的是before中的function函数
fn.apply(this, arguments); // 步骤5,此处执行传入的()=>{console.log("代码结束")函数
return ret
}
}