1.需要安装这个库:npm install reflect-metadata --save

2.在定义类或者类方法的时候,可以设置一些元数据,我们可以获取 到在类与类方法上添加的元数据,用的方法就是 Reflect Metadata。 元数据指的是描述东西时用的数据。

 1 @Reflect.metadata('role', 'admin')
 2 class Post {
 3     @Reflect.metadata('role', 'admin')
 4     name = ''
 5 }
 6 
 7 const metadataClass = Reflect.getMetadata('role', Post,);
 8 const metadataObj = Reflect.getMetadata('role', new Post(),'name');
 9 
10 console.log(metadataClass);// admin
11 console.log(metadataObj); // admin
1.我理解的意思是找到对应映射关系的'key',里面的的'admin' 相当于所对应的'value' ,通过'getMetadata'方法中的'key' 去寻找在映射时候添加的'value',在修饰类和类中 属性的时候使用略有差异 
2.1.当去找'类'所映射的对应关系使用,第一个参数是创建映射时候的'key',第二个 参数是这个'类'
2.2.当去找'类中属性'对应的映射关系时候,三个参数,第一个参数是创建映射时候的'key' ,第二个参数是这个'实例',第三个是实例中所对应的具体'属性',其实可以很容易理解这里 为什么用的是实例,因为有了实例才有了属性

1.除了上面'Reflect.metadata' 这种来给'类' 和 '属性' 增加映射关系,还可以 通自带的api'defineMetadata ' 来增加自定义的映射,这里和上面一样有两种 传参使用方法
  1.1 当只有这 三个参数'metadataKey,metadataValue, target'修饰类的
  1.2 当有这 四个参数'metadataKey,metadataValue, target, propertyKey' 修饰属性
2.参数详细解释:
  2.1 metadataKey -- 设置映射的'key'
  2.2 metadataValue -- 映射'key' 对应的'value'
  2.3 target -- 需要映射对应的类 或者 实例
  2.4 propertyKey 实例上的属性

 1 import 'reflect-metadata'
 2  function PostDec(target:any){
 3      for(let i in target.prototype){
 4         const handle=target.prototype[i]
 5         const path=Reflect.getMetadata('path',target.prototype,i)//获取存的路径
 6         //target.prototype 类Post
 7         //i 属性
 8         handle()
 9      }
10     
11  }
12  function get(path:string){
13     return function(target:any,propertyKey:string){
14         Reflect.defineMetadata('path',path,target,propertyKey)
15         console.log(path,target,propertyKey,1)
16         //'path'  映射的key值
17         //path    映射key对应的value值
18         //target  映射的类
19         //propertyKey 实例上的属性
20     }
21  }
22  @PostDec
23  class Post{
24      @get('/logins')
25      login(){
26          console.log('被调用')
27      }
28  }
参考:https://www.kancloud.cn/cyyspring/vuejs/1164186
posted on 2020-06-23 11:17  小白学前端  阅读(4264)  评论(0编辑  收藏  举报