方法装饰器

语法

type MethodDecorator = <T>(target: Object,propertyKey: string | symbol,descriptor: TypedPropertyDescriptor<T>
) => TypedPropertyDescriptor<T> | void;

(1)target: 对于静态成员来说是类的构造器,对于实例成员来说是类的原型链。
(2)propertyKey: 属性的名称。
(3)descriptor: 属性的描述器。

方法装饰器不同于属性装饰器的地方在于descriptor参数。 通过这个参数我们可以修改方法原本的实现,添加一些共用逻辑。 例如我们可以给一些方法添加打印输入与输出的能力:

function logger(target: any, propertyKey: string, descriptor: PropertyDescriptor) {const original = descriptor.value;descriptor.value = function (...args) {console.log('params: ', ...args);const result = original.call(this, ...args);console.log('result: ', result);return result;}
}class C {@loggeradd(x: number, y:number ) {return x + y;}
}const c = new C();
c.add(1, 2);
// -> params: 1, 2
// -> result: 3

上面的例子,很像 Java 里的 AOP - Aspect Oriented Programming, 面向切片编程。

运行时,我们装饰器施加的 target:

key 是被修饰的 add 方法的字符串名称:

descriptor 的 value 属性指向了 add 方法的原始实现:

…arg 代表任意数量的参数:

第 57 行的 Object.defineProperty, 将类的 add 方法修改成包含了 log 功能的新版本:

这样,稍后我们调用 add 方法时,这个新版本就得以执行了:

更多Jerry的原创文章,尽在:“汪子熙”:

使用 TypeScript 自定义装饰器给类的方法增添监听器 Listener相关推荐

  1. 使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener

    官网链接 语法 type PropertyDecorator =(target: Object, propertyKey: string | symbol) => void; target:直接 ...

  2. python中的类装饰器应用场景_Python 自定义装饰器使用写法及示例代码

    1.Python装饰器简介 python的装饰器就是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.简单的说装饰器就是一个用来返回函数 ...

  3. django class类即视图类添加装饰器的几种方法

    根据别人发布整理,个人爱好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 ) 一.定义视图类 定义类视图,且类视图继承自 ...

  4. python 函数修饰器 父类_Python函数嵌套、回调函数、闭包、装饰器和类

    markdown内容:Python函数嵌套.回调函数.闭包.装饰器和类 一级标题:主要描述内容 二级标题:各个内容 三级标题:重要概念 一.函数嵌套 1.1.作用域和嵌套函数 LEGB查找规则的 E, ...

  5. 三分钟快速了解typeScript的装饰器

    ↓↓↓ typeScript系列学习文章目录 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数 ...

  6. python知识:如何自定义装饰器

    一.说明 本文对装饰器做了一个极其简单的解释图例,并用类定义一个装饰器:一旦一个程序AAA套上@XXX这样的前缀,如 @XXX def AAA(): pass 意味着: 1)AAA已经是XXX的参数. ...

  7. python 类装饰器 __set___python装饰器代替set get方法实例

    对于变量的访问和设置,我们可以使用get.set方法,如下: class student: def __init__(self,name): self.__name = name def get_na ...

  8. python 自定义装饰器 来验证函数参数

    # -*- coding: utf-8 -*- # by dl from inspect import signature # 用来获取函数的一些信息# 自定义参数验证装饰器 def typeasse ...

  9. Angular2入门:TypeScript的装饰器

    Angular2入门:TypeScript的装饰器 转载于:https://www.cnblogs.com/lexiaofei/p/9215505.html

最新文章

  1. python面试-Python面试技巧合集(建议收藏)
  2. 数据库mysql驱动在8.0以上解决时区问题
  3. SAP Fiori Launchpad tile instance creation
  4. mac电脑php中安装swoole扩展件
  5. GitLab 添加组员到指定小组
  6. 开发人员不可不知的六大JavaScript框架 传统网站网页转移动端方式
  7. oc27--synthesize,省略getset实现
  8. 北大计算机学硕几年,我的OI经历 --张正超(深学教育资深教练、北大计算机系研究生)...
  9. 前端响应式布局与Bootstrap栅格系统快速了解与应用
  10. slickedit 运行java_SlickEdit 一些使用技巧(转载)--一个人的博客
  11. Matlab入门变量篇
  12. Excel日期格式转为常规文本格式
  13. LeetCode之Shortest Unsorted Continous Subarray
  14. AI工程师的自我修养
  15. Python网络爬虫爬取智联招聘职位
  16. 计算机专业期末背书,据说大学学这些专业,期末考试最酸爽!
  17. 循环码生成原理与FPGA实现
  18. redis配置文件使用相对路径
  19. 车道线检测识别 [园区道路线检测识别](开源github,欢迎stared)
  20. Lab VRF Rip

热门文章

  1. c语言extern关键字详解
  2. RxLifecycle详细解析
  3. python基础之----函数
  4. pip安装lxml报错
  5. jquery验证表单 提交表单
  6. 其实我就是个技术迷-自身定位及展望
  7. Python2与Python3区别
  8. JavaWeb-SpringBoot(抖音)_二、服务器间通讯
  9. jmeter接口测试实例-关联
  10. android 跳转到系统设置界面的所有Intent