JavaScript面向切面编程入门
来源极客网学习视频
关键词Javascript AOP编程
例子1:
function test() {
alert(2);
}
//理解,所谓的传入一个"回调",该怎样设计before函数
test.before(function(){
alert(1);
});
//思路1:声明一个大Function然后在它的"原型链"上绑上一个before方法,代码如下
Function.prototype.before = function(fn){
var __self = this; //怎样拿到当前函数
fn();
__self.apply(this,arguments);
};
例子2: 为我们自定义的JavaScript的Function设计一"行为",如下例子,声明我们的一个test方法
function test() {
alert(2);
return "me test";
}
要求实现如下效果,为test"赋予"一能力, 在test执行前,先执行我们的另外设计的一个function,比如叫 function before() ,并达到如下效果
test.before(function(){
alert(1);
})();
例子3:
function test() {
alert(2);
}
//思路1:声明一个大Function然后在它的"原型链"上绑上一个before方法,代码如下
//思路2:实现在test()被调用的时候,我们定义的function被回调? 所以为function增加回调函数参数,第7行的fn
//思路3:怎样让before执行在test之前?
Function.prototype.before = function(fn){
var __self = this; //怎样拿到当前函数
fn();
return __self.apply(this,arguments);
};
Function.prototype.after = function(fn){
//after先执行本身this, 再执行"回调"
var __self = this;
__self.apply(this, arguments);
fn();
};
//阅读代码, 调用test的before()方法,并输入一个回调函数
test.before(function(){
alert(1); //输入的回调函数是被"谁"调的,答,由before函数实现代码决定的
})
//理解: 1.所谓的传入一个"回调"; 2.下面的代码可以理解成,我们需要设计function test的after行为
test.after(function(){
alert(3);
});
//注意点: 从第20行起开始执行, 默认函数test()被执行了2遍
例子4: 执行test前,先执行before(), 实际运行的效果先后打印1,2
Function.prototype.before = function(fn){
var __self = this;
return function(){
fn.apply(__self,arguments);
__self.apply(__self,arguments);
}
};
解读:第4行表示先执行回调函数, 同时将调用者自身传入进去; 第5行表示执行调用者自身,同时将自己以及参数传入进去
在实际coding过程中发现将第4,第5行写成如下形式,执行效果一样,先后打印1,2
fn.apply();
__self.apply();
进一步理解,再看下面的代码,其中 test() 方法同上
Function.prototype.before = function(fn){
var __self = this;
return function(){
fn.apply(this,arguments);//理解JavaScript中所谓的"动态改变指针"的特性
__self.apply(__self,arguments);//__self.apply(this,arguments);
}
};
Function.prototype.after = function(fn){
//after先执行本身this, 再执行"回调"
var __self = this;
return function(){
__self.apply(__self, arguments);
fn.apply(this,arguments);
}
};
//当完成上面的设计后,我们就可以将after"移"到before之后,代码如下
test.before(function(){
alert(1);
}).after(function(){
alert(3);
})();
将第5行__self改成this也是可以的,表示将调用者的"指针"传入进去
将第13行注释掉,则只打印3,
说明: test.before(function(){alert(1); }) 被整个传入了 after() 方法中去了并且被执行了
JavaScript面向切面编程入门的更多相关文章
- 前端常用的库和实用技术之JavaScript面向切面编程
Aspect Oriented Programming(AOP)面向切面编程是一个比较热门的话题. AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程 中的某个步骤或阶段,以 ...
- Spring AOP 面向切面编程入门
什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...
- Javascript aop(面向切面编程)之around(环绕)
Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...
- JavaScript实现AOP(面向切面编程)
什么是AOP? AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计.安全控制.异常处理等.把这些功能抽离出来之后, 再通过" ...
- JavaScript实现AOP(面向切面编程,装饰者模式)
什么是AOP? AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计.安全控制.异常处理等.把这些功能抽离出来之后, 再通过“动态织入 ...
- spring入门(四)【面向切面编程】
开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而 ...
- Spring.Net快速入门:控制翻转、依赖注入、面向切面编程
Spring.Net主要功能: 1.IoC:控制翻转(Inversion of Control) 理解成抽象工厂翻转控制:就是创建对象的权利由开发人员自己控制New,转到了由容器来控制. 2.DI: ...
- javascript AOP(面向切面编程)
var func = function () { console.log("2") } Function.prototype.before = function (beforefn ...
- Spring之AOP(面向切面编程)_入门Demo
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...
随机推荐
- vue.js初学(二)
1:构造器 var app = new Vue ( { //选项 }) 注意点: (1) 之后会经常用vm代表Vue实例 (2)实例化之后 需要传入一个选项对象,它可以包括数据.模板.挂载元素.方法. ...
- 在ARM模式下捕获VM并创建新VM
在ASM模式下,可以通过Manage Portal上捕获VM的Image,并创建新的VM.在ARM模式下,在Portal上目前还没有这个功能,要做VM镜像的捕获和创建新的VM需要用powershell ...
- 反射ORM 三层(for sql server/mysql)
sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 RPROM.cs //(写错愕,应该是RPORM) RPROM.Insert(p1); //需求:DBS中 ...
- 蓝桥杯 算法训练 ALGO-143 字符串变换
算法训练 字符串变换 时间限制:1.0s 内存限制:256.0MB 问题描述 相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了.今天,徐老师想测试一下大家对于字符串操作的掌 ...
- Cassandra 学习三 安装
1: 下载Cassandra 2 解压 3 设置环境变量 4 修改cassandra里的conf目录下配置文件 配置文件地址是 D:\cassandra\apache ...
- linq to sql 类的使用
本文介绍linq to sql模型类的使用 EntityFramework是重量级的数据库模型,如果你想要一个简单轻量级的数据库模型,建议使用linq to sql类 创建模型类 在项目中添加linq ...
- 2016.1.23 通过cmd在程序中执行sql脚本
System.Diagnostics.Process pro = new System.Diagnostics.Process(); pro.StartInfo.FileName = "cm ...
- 问题:C#将base64转换成二进制图片;结果:c# Base64编码和图片的互相转换代码
c# Base64编码和图片的互相转换代码 Base64编码在Web方面有很多应用,譬如在URL.电子邮件方面.网上有很多相关的资源用于提供Base64编码和其他编码的转换,.Net Framewor ...
- docker 笔记 (7) 限制容器
内存 -m 或 --memory:设置内存的使用限额,例如 100M, 2G.--memory-swap:设置 内存+swap 的使用限额.--vm 1:启动 1 个内存工作线程.--vm-bytes ...
- Android Tombstone 分析
1.什么是tombstone 当一个动态库(native 程序)开始执行时,系统会注册一些连接到 debuggerd 的 signal handlers,当系统 crash 的时候,会保存一个 tom ...