在学习关于JavaScript的装饰者设计模式的过程中,发现其实现方式的关键在于this的使用。

  想象一个匿名函数(其实预定义的有名函数也可以,都存在引用),其中的this:

 // 我们先定义一个匿名函数的引用foo
var foo = function(){
console.log(`我是 ${this}`)}; //创建一个空的Object实例 var bar = {}; //很空 但是依然有其默认原型Object.prototype的方法和属性 //如果我们写出下列语句 bar.foo = foo; //这意味着把上面定义的匿名函 ”挂载“到实例bar的foo方法中 //
bar.foo() //我是 [object Object](bar)。这里其实调用了Object原型上的toString方法,下同。 foo() // 我是 [object global](node: global/ 浏览器: window)

  到这里,读者可能会疑惑,这个”挂载“的过程跟题目的AOP装饰函数有什么关系。

  在JS中,装饰模式的实现简单来说就是 将对象的某个原方法与其他的函数进行加工合并,从而输出一个”匿名函数“, 就像上面代码定义的匿名函数一样,将这个输出的”匿名函数“,”挂载到原对象的原方法上面“,就完成了在原方法前后产生附加动作的效果。

  我们给出AOP的基础实现代码,一步步的分析:

 //首先定义对象
//这个对象有属性score,以及方法main var bar = {
score : 60,
main: function(){ console.log("我的分数"+this.score);}
}; //突然,我想另外输出bar同学分数的平方根, 要求不过分吧
//可能你会想到,在bar同学中添加新的方法去输出平方根,或者定义一个新的函数去处理bar同学的分数。 //接下来,我们利用AOP来实现这个方法 Function.prototype.after= function(fn){
var _self = this;
return function(){
var result = _self.apply(this,arguments);
fn.apply(this,arguments);
return result; };
}; //输出平方根的函数
function sqrt(){
console.log("我的分数的平方根"+Math.sqrt(this.score));}
//挂载到main上 bar.main = bar.main.after(sqrt); //输出新的合成匿名函数
bar.main();//我的分数60
// 我的分数的平方根7.745966692414834

  看到14-20行的代码中的this,其实我一开始有点懵,第一个this指的是 Function实例——即bar.main,而返回的匿名函数中的this是指其挂载的对象,这里是挂载的是bar,如果不挂载的话,这个this就指向运行环境的顶层对象或者null,这是需要关注的地方,换句话说,如果没有那两句apply语句,那么合成匿名函数的这些函数集合中的this可能会丢失,而指向顶层对象或者null。

  所以在装饰者模式中,this的指向与是否挂载息息相关,进一步的说,在代码的某个地方使用this,无论是函数声明的语句,还是运行上下文中的语句,及时保存this的指向和挂载正确的对象 都是十分必要的!

关于AOP装饰函数中的this的更多相关文章

  1. Python-装饰器中保留被装饰函数元数据

     函数的元数据包括哪些呢? 1. 函数名 .__name__ 2. 函数注释 .__doc__ ... 那,如何保留被装饰函数元数据,通过wraps装饰器保留被装饰函数的元数据 import time ...

  2. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

  3. Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  4. python_如何修改装饰器中参数?

    案例: 为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器 需求: 统计被装饰函数的运行时间 时间大于timeout时,将此次函数调用记录到log日志中 运行时可以修改t ...

  5. Python装饰函数

    from time import ctime, sleep def tsfunc(func): def wrappedFunc(): print('[%s] %s() classed' % (ctim ...

  6. python函数中闭包的概念说明

    函数中闭包的概念说明 闭包: 内层函数对外层函数非全局变量的引用,就叫做闭包 判断闭包方法 ._closure_ : 执行后返回有效信息就是闭包,返回none就不是闭包 举例1: 是闭包 def wr ...

  7. python函数中的参数(关键字参数,默认参数,位置参数,不定长参数)

    默认参数:定义函数的时候给定变量一个默认值. def num(age=1): 位置参数:调用函数的时候根据定义函数时的形参位置和实参位置进行引用. 关键字参数:如果定义的函数中含有关键字参数,调用函数 ...

  8. python 装饰函数2

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue May 5 21:40:49 2020 ...

  9. JS中bind、call和apply的作用以及在TS装饰器中的用法

    目录 1,前言 1,call 1.1,例子 1.2,直接调用 1.3,将this指向另一个对象 1.4,传递参数 2,apply 2.1,例子 2.2,直接调用 2.3,将this指向另一个对象 2. ...

随机推荐

  1. 团队作业8----第二次项目冲刺(beta阶段)5.23

    Day5-05.23 1.每日会议 会议内容: 1.组长林乔桦对昨日的工作进行了总结并且安排今日的任务. 2.潘益靖副组长说明昨日任务的完成情况. 3.组员对昨天的各项工作进行了汇报以及对今天的工作进 ...

  2. 201521123004《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口 接口(interface)就是方法声明和常量值的集合 实现接口的类叫接口的 ...

  3. 201521123057 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...

  4. 201521123053《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 我还是比较喜欢XMind思维导图 延续上周对线程的知识点总结,对多线程知识点进行扩充. 知识点: synchron ...

  5. POJ-3045 Cow Acrobats (C++ 贪心)

    Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...

  6. PeopleRank

    PeopleRank:基于PageRank的理论,以每个微博账户的“关注”为链出链接,“粉丝”为链入链接的这种以人为核心的关系. PeopleRank假设条件:– 数量假设:如果一个用户节点接收到的其 ...

  7. [cocos2dx] lua注册回调到c++

    思路 像所有语言一样,绑定回调主要是执行的任务执行到特定情形的时候,调用对用回调方法. 这里也一样.核心思路是,当c代码执行到特定特定情形的时候,调用lua的方法 我这里使用的是用lua_stack直 ...

  8. nodejs 初次链接 mongodb 的详细细节

    时间  2016-06-2613:05:16 在前端的学习也有一段时间了,学习了html,css,javascript,jqery,ajax,php,mysql,学习了这些,了解了一些皮毛,也没有什么 ...

  9. jquery实现点击div外隐藏div

    html <div style="width:100px;height:100px;border:1px solid #ff0" id="div"> ...

  10. 记录maven 整合SSM框架

    一.新建maven项目 建好的项目结构如下图: 还需要做以下配置: 勾选上这两项后,就会自动生成 "src/main/java"   和 "src/main/resour ...