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可 ...
随机推荐
- PHP怎么把经过UTF-8编码的中文字符转换成正常的中文
问题的场景: html 为utf-8编码<meta http-equiv="Content-Type" content="text/html; charset=UT ...
- Visualforce Page CSS样式
Salesforce Page开发者文档:https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_stylin ...
- Powershell使用SSH
在编写Powershell脚本时,有时会需要和Linux机器进行交互.所以这时就需要在Powershell中使用SSH. 本文将介绍如何在Powershell中安装SSH模块,以及如何使用ssh命令. ...
- php 字符串的分割
http://blog.sina.com.cn/s/blog_71ed1b870102uysa.html
- ps命令,性能监控,grep命令
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- Java-API:java.util.Date
ylbtech-Java-API:java.util.Date Module java.base Package java.util Class Date java.lang.Object java. ...
- 用python的for循环写冒泡排序
题目:利用for循环,完成a=[1,7,4,89,34,2]的冒泡排序(冒泡排序:小的排前面,大的排后面.) 第一种:可以看到每次排序的结果 a = [100,97,4,89,34,2] n = 0 ...
- [置顶]
if语句的陷阱
if else if是只要有满足条件的,就不再对之后的else if进行判断 #include<stdio.h> void main() { char a=0; if(a==0) { a= ...
- C# DataTable的常用用法讲解
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...
- springmvc----demo2---a->b--bai
1.jsp 2.jsp 3.jsp LianxiAction: package com.etc.controller; import javax.servlet.http.HttpSession; i ...