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代码模拟装 ...
随机推荐
- Mybatis 实体类驼峰命名与数据库字段之间映射
数据库的命名规则和 Java 的命名规则不一致,导致实体类与数据库字段不能完美映射. 一.可以在 mapper.xml 中通过 resultMap 来解决: <resultMap id=&quo ...
- GPS地图生成01之概述
图片来源: Author: Tang Email: jianbo.tang@csu.edu.cn
- MTU设置不当导致ssh运行命令卡死
MTU:最大网络传输单元,计算机网络课会介绍. 场景: 本地通过VPN连接某个机房内网的linux服务器,连接上之后,运行top命令.vi命令.yum update等需要刷新大量内容时导致ssh卡死, ...
- WPFMVVM实现ICommand与INotifyPropertyChanged接口
话不多说直接上代码 INotifyPropertyChanged实现代码 internal class NotifyBase : INotifyPropertyChanged { public eve ...
- K8S资源控制器
什么是控制器 kubernetes中建立了很多的controller(控制器),这相当于一个控制机,来管理pod的状态和行为. 控制器的类型 ReplicationController和Replica ...
- 3.2 删除XxxControler中各方法中的response
3.2.1 EmpController代码 package com.hy.controller; import javax.servlet.http.HttpServletRequest; impor ...
- FPGA MIG调试bug(二)
目标器件:复旦微FPGA:JFM7K325T8FCBGA676(对标Xilinx Kintex-7系的XC7K325T) 工程背景:送入FPGA的外部时钟为差分时钟,时钟送入FPGA后,经过PLL输出 ...
- Java面向对象之内部类
内部类 内部类:在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对于B类来说就是外部类了. 1.成员内部类 2.静态内部类 3.局部内部类 4.匿名内部 ...
- Oracle 详细-创建用户并导入sql文件
0.基本信息查询SQL select * from dba_users; 查看数据库里面所有用户,前提是你是有dba权限的帐号,如sys,system select * from all_u ...
- 080_Dataloader.io
图中是之前使用的Dataloader,关于Lookup字段可以不使用ID,用ID对应的Name进行匹配,如图