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