来源极客网学习视频

关键词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面向切面编程入门的更多相关文章

  1. 前端常用的库和实用技术之JavaScript面向切面编程

    Aspect Oriented Programming(AOP)面向切面编程是一个比较热门的话题. AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程 中的某个步骤或阶段,以 ...

  2. Spring AOP 面向切面编程入门

    什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...

  3. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...

  4. JavaScript实现AOP(面向切面编程)

    什么是AOP? AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计.安全控制.异常处理等.把这些功能抽离出来之后, 再通过" ...

  5. JavaScript实现AOP(面向切面编程,装饰者模式)

    什么是AOP? AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计.安全控制.异常处理等.把这些功能抽离出来之后, 再通过“动态织入 ...

  6. spring入门(四)【面向切面编程】

    开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而 ...

  7. Spring.Net快速入门:控制翻转、依赖注入、面向切面编程

    Spring.Net主要功能: 1.IoC:控制翻转(Inversion of Control)  理解成抽象工厂翻转控制:就是创建对象的权利由开发人员自己控制New,转到了由容器来控制. 2.DI: ...

  8. javascript AOP(面向切面编程)

    var func = function () { console.log("2") } Function.prototype.before = function (beforefn ...

  9. Spring之AOP(面向切面编程)_入门Demo

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...

随机推荐

  1. Python List reverse()方法

    reverse() 函数用于反向列表中元素,参数 NA,该方法没有返回值,但是会对列表的元素进行反向排序,原来的列表被改变,生成新的列表. 例子:list1 = ['Google', 'Runoob' ...

  2. HDU5478(快速幂)

    Can you find it Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. el表达式对js方法的传值

    我常用于在jsp页面遍历集合和分页中的页面跳转事件. jsp: <!-- 引入jstl --> <%@ taglib prefix="c" uri="h ...

  4. Day2-VIM(六): 恢复

    恢复在VIM里比较简单,不过想要具体恢复到某个时间段很难 就我的经验而言,有时候使用恢复还不如删了重写 这里我们来讲讲恢复.撤销和重复命令的使用 u 撤消上次命令 U 恢复整行 ctrl+r 重做 . ...

  5. ajax 原理

    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.    其中最关键的一步就是从服务器获得请求数据. ...

  6. linux参数之max_map_count

    “This file contains the maximum number of memory map areas a process may have. Memory map areas are ...

  7. 构建工具:webpack与grunt/gulp

    1.    webpack 官网:http://webpack.github.io/docs/ 中文文档:http://www.css88.com/doc/webpack2/ Webpack 是一个模 ...

  8. wp8安装SSL证书

    把证书打成zip包,wp8的IE能下载并打开ZIP包,然后点击cer文件,就能安装证书了

  9. 问题:oracle触发器无效且未通过重新验证;结果:触发器里面没有加分号(;)

    oracle无效且未通过重新验证 代码如下: SQL code如下: --创建中国地图表 create table  china_address (        id number not null ...

  10. Caused by: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor

    Bitmap bmp =BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); Paint paint = new ...