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可 ...
随机推荐
- Java基础--CountDownLatch
CountDownLatch是线程同步辅助类,它允许一个或多个线程wait直到countdown被调用使count为0. CountDownLatch是在java1.5被引入,存在于java.util ...
- dijstra+输出路径总结
#include<iostream> #include<math.h> #include<memory.h> using namespace std; #defin ...
- windows下socket编程:区分shutdown()及closesocket()
以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...
- linux命令-sudo普通用户拥有root权限
普通用户权限不够 [root@wangshaojun ~]# su - dennywang[dennywang@wangshaojun ~]$ ls /root/ls: 无法打开目录/root/: 权 ...
- MSSQL 日期查询 包含NULL值
方一: 以下做法保证数据里面没有NULL值 '') '') '') '') exec sp_executesql N'select ide_code as ''系统编号'',name as ''申请专 ...
- onRetainNonConfigurationInstance方法状态保存
onRetainNonConfigurationInstance方法作用于ONSAVEINSTANCE类似,但是能保存更多的信息,可以使用getLastNonConfigurationInstance ...
- Codeforces 1108F (MST Unification) (树上倍增 or 改进 kruksal)
题意:给你一张n个节点和m条边的无向连通图, 你可以执行很多次操作,对某一条边的权值+1(对于每条边,可以不加,可以无限次加),问至少进行多少次操作,可以使这张图的最小生成树变得唯一,并且最小生成树的 ...
- str_place()替换函数
str_replace() 函数使用一个字符串替换字符串中的另一些字符. 注释:该函数对大小写敏感.请使用 str_ireplace() 执行对大小写不敏感的搜索. echo str_replace( ...
- 批处理基本知识以及进阶 V2.0
批处理基本知识以及进阶 将以要执行的程序指令 , 像在 dos 模式下一下写入记事本 , 保存成 bat 文件 , 就可以执行了 一 . 简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求 ...
- java开发中用到的技术(持续更新.....)
一.数据库 1.数据库连接池:当jdbc连接数据库使用DriverManager 获取时,每次向数据库建立连接的时候都要讲connection加载到内存中,当同时使用的用户数量较大时,会造成服务器不堪 ...