1. console.log('装饰器.......')
  2. // 装饰器就是一个方法,可以注入到类,方法,属性上来拓展类,属性,方法,参数的功能
  3. // 常见:类装饰器,属性装饰器,方法装饰器,参数装饰器
  4. // 写法:1.普通装饰器(无法传参) 2.装饰器工厂(可传参)
  5.  
  6. // 1.类装饰器
  7. // 类装饰器在类声明之前被声明(紧靠着类声明)。 类装饰器应用于类构造函数,可以用来监视,修改或替换类定义。
  8. // 普通装饰器(无法传参)
  9. function logClass(params: any) {
  10. console.log(params)
  11. // 通过原型链拓展类,属性,方法,参数
  12. params.prototype.apiUrl = 'xxx'
  13. params.prototype.run = function () {
  14. console.log('run...........')
  15. }
  16. }
  17.  
  18. @logClass
  19. class HttpClient {
  20. constructor() {}
  21. getData() {}
  22. }
  23. let http: any = new HttpClient()
  24. console.log(http)
  25. http.run()
  26.  
  27. // 装饰器工厂(可传参)
  28. function logClass1(params: string) {
  29. return function (target: any) {
  30. console.log(params)
  31. console.log(target)
  32. target.prototype.apiUrl = params
  33. }
  34. }
  35.  
  36. @logClass1('hello')
  37. class HttpClient1 {
  38. constructor() {}
  39. getData() {}
  40. }
  41. let http1: any = new HttpClient1()
  42. console.log(http1)
  43.  
  44. // 重载构造函数
  45. function logClass2(target: any) {
  46. return class extends target {
  47. api: any = 'api2222'
  48. getData() {
  49. console.log(this.api + '333')
  50. }
  51. }
  52. }
  53.  
  54. @logClass2
  55. class HttpClient2 {
  56. public api: string | undefined
  57. constructor() {
  58. this.api = 'api11111'
  59. }
  60. getData() {
  61. console.log(this.api)
  62. }
  63. }
  64. let http2: any = new HttpClient2()
  65. console.log(http2)
  66. http2.getData()
  67.  
  68. // 2.属性装饰器
  69. // 属性装饰器表达式会在运行时被当作函数调用
  70. // 接收两个参数
  71. // 1. 对于静态成员是类的构造函数,对于实例成员是类的原型对象
  72. // 2. 成员的名字
  73.  
  74. // 类装饰器
  75. function logClass3(params: string) {
  76. return function (target: any) {
  77. // console.log(params)
  78. // console.log(target)
  79. target.prototype.apiUrl = params
  80. }
  81. }
  82.  
  83. // 属性装饰器
  84. function logProperty(params: string) {
  85. return function (target: any, attr: any) {
  86. // console.log(params)
  87. // console.log(target)
  88. target[attr] = params
  89. }
  90. }
  91.  
  92. @logClass3('hello33333')
  93. class HttpClient3 {
  94. @logProperty('hello4444')
  95. public api: any | undefined
  96. constructor() {}
  97. getData() {}
  98. }
  99. let http3: any = new HttpClient3()
  100. console.log(http3)
  101.  
  102. // 3.方法装饰器
  103. // 应用在方法的属性描述上,可以用来监视、修改、替换方法定义
  104. // 接收三个参数
  105. // 1. 对于静态成员是类的构造函数,对于实例成员是类的原型对象
  106. // 2. 成员的名字
  107. // 3. 成员的属性的描述
  108. function logClass4(params: string) {
  109. return function (target: any, methodsName: any, desc: any) {
  110. console.log(target)
  111. console.log(methodsName)
  112. console.log(desc)
  113. console.log(desc.value)
  114. let o = desc.value
  115. desc.value = function (...args: any[]) {
  116. args = args.map((item) => {
  117. return String(item) + params
  118. })
  119. o.apply(this, args)
  120. }
  121. }
  122. }
  123.  
  124. class HttpClient4 {
  125. public api: any | undefined
  126. constructor() {}
  127. @logClass4('方法装饰器方法装饰器方法装饰器方法装饰器')
  128. getData(...args: any[]) {
  129. console.log(args)
  130. console.log('getDatagetDatagetData')
  131. }
  132. }
  133. let http4: any = new HttpClient4()
  134. http4.getData(123, 'xxx')
  135.  
  136. // 4.参数装饰器
  137. // 参数装饰器表达式会在运行时当作函数被调用,可以使参数装饰器为类的原型增加一些元素数据
  138. // 1. 对于静态成员是类的构造函数,对于实例成员是类的原型对象
  139. // 2. 参数的名字
  140. // 3. 参数索引
  141. function logClass5(params: string) {
  142. return function (target: any, methodsName: any, desc: any) {
  143. console.log(target)
  144. console.log(methodsName)
  145. console.log(desc)
  146. }
  147. }
  148.  
  149. class HttpClient5 {
  150. public api: any | undefined
  151. constructor() {}
  152.  
  153. getData(@logClass5('参数装饰器参数装饰器') uuid: any) {
  154. console.log(uuid)
  155. }
  156. }
  157. let http5: any = new HttpClient5()
  158. http5.getData(1232123)
  159.  
  160. // 装饰器执行顺序
  161. // 属性>方法参数>方法>>类
  162. // 存在多个同样装饰器则是从下到上执行
  163. function logClass6(params: string) {
  164. return function (target: any, methodsName: any, desc: any) {
  165. console.log(params)
  166. }
  167. }
  168. function logClass7(params: string) {
  169. return function (target: any, methodsName: any, desc: any) {
  170. console.log(params)
  171. }
  172. }
  173. function logClass8(params: string) {
  174. return function (target: any, methodsName: any, desc: any) {
  175. console.log(params)
  176. }
  177. }
  178. function logClass9(params: string) {
  179. return function (target: any, methodsName: any, desc: any) {
  180. console.log(params)
  181. }
  182. }
  183.  
  184. function logClass10(params: string) {
  185. return function (target: any) {
  186. console.log(params)
  187. }
  188. }
  189.  
  190. function logClass11(params: string) {
  191. return function (target: any, attr: any) {
  192. console.log(params)
  193. }
  194. }
  195.  
  196. @logClass10('类装饰器装饰器')
  197. class HttpClient6 {
  198. @logClass11('属性装饰器')
  199. public api: any | undefined
  200. constructor() {}
  201. @logClass8('方法装饰器装饰器1')
  202. @logClass9('方法装饰器装饰器2')
  203. getData(
  204. @logClass6('参数装饰器1') uuid1: any,
  205. @logClass7('参数装饰器2') uuid2: any
  206. ) {
  207. console.log(uuid1)
  208. console.log(uuid2)
  209. }
  210. }
  211. let http6: any = new HttpClient6()
  212. http6.getData(1232123, 234)

ts的装饰器的更多相关文章

  1. ts装饰器的用法,基于express创建Controller等装饰器

    TS TypeScript 是一种由微软开发的自由和开源的编程语言.它是 JavaScript 的一个超集,而且本质上向这个语言添加了可选的静态类 型和基于类的面向对象编程. TypeScript 扩 ...

  2. TS 自学笔记(二)装饰器

    TS 自学笔记(二)装饰器 本文写于 2020 年 9 月 15 日 上一篇 TS 文章已经是很久之前了.这次来讲一下 TS 的装饰器. 对于前端而言,装饰器是一个陌生的概念,但是对于 Java.C# ...

  3. ts中的装饰器

    // 装饰器一种特殊的类的声明, 扩展类.属性.方法. function logClass(params:any) { console.log(params); // params代表HttpClic ...

  4. 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. ...

  5. python-大话装饰器

    装饰器 装饰器是个什么玩意呢?是个会了不难,装逼神器.但是如果不了解理解起来还是很抽象,让我们试试这个装逼神器吧! 1.什么是装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典 ...

  6. Python学习笔记——基础篇2【第三周】——计数器、有序字典、元组、单(双)向队列、深浅拷贝、函数、装饰器

    目录 1.Python计数器Counter 2.Python有序字典OrderredDict 3.Python默认字典default 4.python可命名元组namedtuple 5.Python双 ...

  7. 基于TypeScript装饰器定义Express RESTful 服务

    前言 本文主要讲解如何使用TypeScript装饰器定义Express路由.文中出现的代码经过简化不能直接运行,完整代码的请戳:https://github.com/WinfredWang/expre ...

  8. TypeScript装饰器(decorators)

    装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上,可以修改类的行为. 装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被 ...

  9. JS 装饰器解析

    随着 ES6 和 TypeScript 中类的引入,在某些场景需要在不改变原有类和类属性的基础上扩展些功能,这也是装饰器出现的原因. 装饰器简介 作为一种可以动态增删功能模块的模式(比如 redux ...

  10. 【Angular专题】 (3)装饰器decorator,一块语法糖

    目录 一. Decorator装饰器 二. Typescript中的装饰器 2.1 类装饰器 2.2 方法装饰器 2.3 访问器装饰器 2.4 属性装饰器 2.5 参数装饰器 三. 用ES5代码模拟装 ...

随机推荐

  1. Mybatis 实体类驼峰命名与数据库字段之间映射

    数据库的命名规则和 Java 的命名规则不一致,导致实体类与数据库字段不能完美映射. 一.可以在 mapper.xml 中通过 resultMap 来解决: <resultMap id=&quo ...

  2. GPS地图生成01之概述

    图片来源: Author: Tang Email: jianbo.tang@csu.edu.cn

  3. MTU设置不当导致ssh运行命令卡死

    MTU:最大网络传输单元,计算机网络课会介绍. 场景: 本地通过VPN连接某个机房内网的linux服务器,连接上之后,运行top命令.vi命令.yum update等需要刷新大量内容时导致ssh卡死, ...

  4. WPFMVVM实现ICommand与INotifyPropertyChanged接口

    话不多说直接上代码 INotifyPropertyChanged实现代码 internal class NotifyBase : INotifyPropertyChanged { public eve ...

  5. K8S资源控制器

    什么是控制器 kubernetes中建立了很多的controller(控制器),这相当于一个控制机,来管理pod的状态和行为. 控制器的类型 ReplicationController和Replica ...

  6. 3.2 删除XxxControler中各方法中的response

    3.2.1 EmpController代码 package com.hy.controller; import javax.servlet.http.HttpServletRequest; impor ...

  7. FPGA MIG调试bug(二)

    目标器件:复旦微FPGA:JFM7K325T8FCBGA676(对标Xilinx Kintex-7系的XC7K325T) 工程背景:送入FPGA的外部时钟为差分时钟,时钟送入FPGA后,经过PLL输出 ...

  8. Java面向对象之内部类

    内部类 内部类:在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对于B类来说就是外部类了. 1.成员内部类 2.静态内部类 3.局部内部类 4.匿名内部 ...

  9. Oracle 详细-创建用户并导入sql文件

       0.基本信息查询SQL   select * from dba_users; 查看数据库里面所有用户,前提是你是有dba权限的帐号,如sys,system select * from all_u ...

  10. 080_Dataloader.io

    图中是之前使用的Dataloader,关于Lookup字段可以不使用ID,用ID对应的Name进行匹配,如图