ts的装饰器
console.log('装饰器.......')
// 装饰器就是一个方法,可以注入到类,方法,属性上来拓展类,属性,方法,参数的功能
// 常见:类装饰器,属性装饰器,方法装饰器,参数装饰器
// 写法:1.普通装饰器(无法传参) 2.装饰器工厂(可传参)
// 1.类装饰器
// 类装饰器在类声明之前被声明(紧靠着类声明)。 类装饰器应用于类构造函数,可以用来监视,修改或替换类定义。
// 普通装饰器(无法传参)
function logClass(params: any) {
console.log(params)
// 通过原型链拓展类,属性,方法,参数
params.prototype.apiUrl = 'xxx'
params.prototype.run = function () {
console.log('run...........')
}
}
@logClass
class HttpClient {
constructor() {}
getData() {}
}
let http: any = new HttpClient()
console.log(http)
http.run()
// 装饰器工厂(可传参)
function logClass1(params: string) {
return function (target: any) {
console.log(params)
console.log(target)
target.prototype.apiUrl = params
}
}
@logClass1('hello')
class HttpClient1 {
constructor() {}
getData() {}
}
let http1: any = new HttpClient1()
console.log(http1)
// 重载构造函数
function logClass2(target: any) {
return class extends target {
api: any = 'api2222'
getData() {
console.log(this.api + '333')
}
}
}
@logClass2
class HttpClient2 {
public api: string | undefined
constructor() {
this.api = 'api11111'
}
getData() {
console.log(this.api)
}
}
let http2: any = new HttpClient2()
console.log(http2)
http2.getData()
// 2.属性装饰器
// 属性装饰器表达式会在运行时被当作函数调用
// 接收两个参数
// 1. 对于静态成员是类的构造函数,对于实例成员是类的原型对象
// 2. 成员的名字
// 类装饰器
function logClass3(params: string) {
return function (target: any) {
// console.log(params)
// console.log(target)
target.prototype.apiUrl = params
}
}
// 属性装饰器
function logProperty(params: string) {
return function (target: any, attr: any) {
// console.log(params)
// console.log(target)
target[attr] = params
}
}
@logClass3('hello33333')
class HttpClient3 {
@logProperty('hello4444')
public api: any | undefined
constructor() {}
getData() {}
}
let http3: any = new HttpClient3()
console.log(http3)
// 3.方法装饰器
// 应用在方法的属性描述上,可以用来监视、修改、替换方法定义
// 接收三个参数
// 1. 对于静态成员是类的构造函数,对于实例成员是类的原型对象
// 2. 成员的名字
// 3. 成员的属性的描述
function logClass4(params: string) {
return function (target: any, methodsName: any, desc: any) {
console.log(target)
console.log(methodsName)
console.log(desc)
console.log(desc.value)
let o = desc.value
desc.value = function (...args: any[]) {
args = args.map((item) => {
return String(item) + params
})
o.apply(this, args)
}
}
}
class HttpClient4 {
public api: any | undefined
constructor() {}
@logClass4('方法装饰器方法装饰器方法装饰器方法装饰器')
getData(...args: any[]) {
console.log(args)
console.log('getDatagetDatagetData')
}
}
let http4: any = new HttpClient4()
http4.getData(123, 'xxx')
// 4.参数装饰器
// 参数装饰器表达式会在运行时当作函数被调用,可以使参数装饰器为类的原型增加一些元素数据
// 1. 对于静态成员是类的构造函数,对于实例成员是类的原型对象
// 2. 参数的名字
// 3. 参数索引
function logClass5(params: string) {
return function (target: any, methodsName: any, desc: any) {
console.log(target)
console.log(methodsName)
console.log(desc)
}
}
class HttpClient5 {
public api: any | undefined
constructor() {}
getData(@logClass5('参数装饰器参数装饰器') uuid: any) {
console.log(uuid)
}
}
let http5: any = new HttpClient5()
http5.getData(1232123)
// 装饰器执行顺序
// 属性>方法参数>方法>>类
// 存在多个同样装饰器则是从下到上执行
function logClass6(params: string) {
return function (target: any, methodsName: any, desc: any) {
console.log(params)
}
}
function logClass7(params: string) {
return function (target: any, methodsName: any, desc: any) {
console.log(params)
}
}
function logClass8(params: string) {
return function (target: any, methodsName: any, desc: any) {
console.log(params)
}
}
function logClass9(params: string) {
return function (target: any, methodsName: any, desc: any) {
console.log(params)
}
}
function logClass10(params: string) {
return function (target: any) {
console.log(params)
}
}
function logClass11(params: string) {
return function (target: any, attr: any) {
console.log(params)
}
}
@logClass10('类装饰器装饰器')
class HttpClient6 {
@logClass11('属性装饰器')
public api: any | undefined
constructor() {}
@logClass8('方法装饰器装饰器1')
@logClass9('方法装饰器装饰器2')
getData(
@logClass6('参数装饰器1') uuid1: any,
@logClass7('参数装饰器2') uuid2: any
) {
console.log(uuid1)
console.log(uuid2)
}
}
let http6: any = new HttpClient6()
http6.getData(1232123, 234)
ts的装饰器的更多相关文章
- ts装饰器的用法,基于express创建Controller等装饰器
TS TypeScript 是一种由微软开发的自由和开源的编程语言.它是 JavaScript 的一个超集,而且本质上向这个语言添加了可选的静态类 型和基于类的面向对象编程. TypeScript 扩 ...
- TS 自学笔记(二)装饰器
TS 自学笔记(二)装饰器 本文写于 2020 年 9 月 15 日 上一篇 TS 文章已经是很久之前了.这次来讲一下 TS 的装饰器. 对于前端而言,装饰器是一个陌生的概念,但是对于 Java.C# ...
- ts中的装饰器
// 装饰器一种特殊的类的声明, 扩展类.属性.方法. function logClass(params:any) { console.log(params); // params代表HttpClic ...
- 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. ...
- python-大话装饰器
装饰器 装饰器是个什么玩意呢?是个会了不难,装逼神器.但是如果不了解理解起来还是很抽象,让我们试试这个装逼神器吧! 1.什么是装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典 ...
- Python学习笔记——基础篇2【第三周】——计数器、有序字典、元组、单(双)向队列、深浅拷贝、函数、装饰器
目录 1.Python计数器Counter 2.Python有序字典OrderredDict 3.Python默认字典default 4.python可命名元组namedtuple 5.Python双 ...
- 基于TypeScript装饰器定义Express RESTful 服务
前言 本文主要讲解如何使用TypeScript装饰器定义Express路由.文中出现的代码经过简化不能直接运行,完整代码的请戳:https://github.com/WinfredWang/expre ...
- TypeScript装饰器(decorators)
装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上,可以修改类的行为. 装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被 ...
- JS 装饰器解析
随着 ES6 和 TypeScript 中类的引入,在某些场景需要在不改变原有类和类属性的基础上扩展些功能,这也是装饰器出现的原因. 装饰器简介 作为一种可以动态增删功能模块的模式(比如 redux ...
- 【Angular专题】 (3)装饰器decorator,一块语法糖
目录 一. Decorator装饰器 二. Typescript中的装饰器 2.1 类装饰器 2.2 方法装饰器 2.3 访问器装饰器 2.4 属性装饰器 2.5 参数装饰器 三. 用ES5代码模拟装 ...
随机推荐
- VueTSX 动态使用 element-plus 图标
写 TSX 的目的 element-plus 图标集有很多,但有时需要动态使用某个图标,把所有可能用到的图标都列举出来,通过 v-if 在组件中决定到底渲染哪一个,很费时. .vue 单文件组件中做不 ...
- kubernetes client-go功能介绍
原味地址 https://haiyux.cc/2023/02/26/k8s-client-go/ client-go是什么? client-go是Kubernetes官方提供的Go语言客户端库,用于与 ...
- LeetCode算法训练-回溯 491.递增子序列 46.全排列 47.全排列 II
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练-回溯 491.递增子序列 46.全排列 47.全排列 II LeetCode 491. 递增子序列 分析 找出并返回所有数组中不同的递增子序 ...
- docker下netcore内存dump
一般开发阶段可以通过visualstudio来检查程序的内存 .cup等的优化问题.vs下调试=>性能探查器,这里面大有千秋. 但是好多内存问题是经过时间积累下来才暴露出来的,在生产环境中不做不 ...
- swiper滑动异常
遇到这样的情况,一共5张slide,但是从第三个起再往右划就不动了.后来发现是已经初始化swiper后又追加了slide.(大概意思是这样.太久的程序了,也不想仔细捋了) 暂且用到的办法: 先定义好: ...
- MySQL5.7升级版本到8.0
升级二进制包安装的MySQL In-Place Upgrade(替代升级) 替代升级涉及到shutdown down旧版本的MySQL,用新版本的包替代旧版本的二进制包,用存在的数据文件目录重启MyS ...
- 1487. 保证文件名唯一 (Medium)
问题描述 1487. 保证文件名唯一 (Medium) 给你一个长度为 n 的字符串数组 names .你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹. 由 ...
- 关于tensor2tensor与tensorflow版本冲突的解决方案
工作需要,研究了几天的t2t,万万没想到在虚拟环境的搭建方面出现了问题. 直接安装t2t,当前是1.15.7版本,默认会安装tensorflow的最新版本,最终会在执行t2t-trainer命令的时候 ...
- 肖sir__整理项目链接
项目链接: https://www.cnblogs.com/xiaolehong/p/16460523.html 保险项目https://www.cnblogs.com/xiaolehong/p/16 ...
- 硬件IIC主从机中断代码注释解析
目录 硬件IIC的主从中断在582的最新EVT中已支持. 对于IIC从机中断,例程中已封装好中断处理过程,用户调用app_i2c时,初始化中需要配置回调函数. 初始化的配置如下. struct i2c ...