Reflect Metadata

简介: Reflect Metadata

Reflect MetadataES7(ES2016) 的一个提案。当然,并没有通过,否则就能直接用了,注意:它是 ES6Reflect API的扩展。它主要用来在声明的时候添加和读取元数据


设计目的

Reflect Metadata 的目的是给对象添加额外的信息,但是不影响对象的结构,这一点至关重要!也就是当我们给对象添加一些原始信息的时候,对象是不会有任何变化的,不会多 property ,也不会有 property 被修改,更不会删除已有的 property


实现原理

首先,对于一个对象来说,它可以有很多个metadata ,每一个 metadata 都有一个 key ,以及 metadatavalue ,同时,相同对象下的 metadatakey 应该是唯一的,不可重复的。而且从设计目的出发,又不会修改对象。通过阅读源码,发现作者是通过维护一个 全局变量 的方式来实现的。


核心代码

const usePolyfill = typeof process === "object" && process.env && process.env["REFLECT_METADATA_USE_MAP_POLYFILL"] === "true";
const _Map: typeof Map = !usePolyfill && typeof Map === "function" && typeof Map.prototype.entries === "function" ? Map : CreateMapPolyfill();
const _WeakMap: typeof WeakMap = !usePolyfill && typeof WeakMap === "function" ? WeakMap : CreateWeakMapPolyfill();
const Metadata = new _WeakMap<any, Map<string | symbol | undefined, Map<any, any>>>();点击复制复制失败已复制


上述代码中 Metadata 就是作者维护的全局变量。(代码中有一些polyfill相关的,影响阅读,专注核心即可)


Metadata 是一个 WeakMap 类型,使用 WeakMap 而不是 Map 这个问题请转至笔记Javascript WeakMap。看起来三层 Map 会比较绕,我们从元数据的获取角度来看这个


结构:

Metadata.get(target).get(property).get(key)


其中:

  • target:类
  • property:属性,如果是类的metadata,这里是undefined
  • key:metadata key


这时候就会看起来很清晰了,整个 reflect-metadata 库无非就是维护这个全局变量而已!


核心思想是有了,接下来看一下具体使用方式:Reflect Metadata用法

目录
相关文章
|
5月前
|
存储 人工智能 Java
深入理解 go reflect - 要不要传指针
深入理解 go reflect - 要不要传指针
31 0
|
7月前
|
JavaScript Java API
30.【TypeScript 教程】Reflect Metadata
30.【TypeScript 教程】Reflect Metadata
140 4
|
8月前
|
Go
go 反射Reflect
go 反射Reflect
|
8月前
|
JSON 缓存 测试技术
反射之 reflect.TypeOf() 和 reflect.Type
反射之 reflect.TypeOf() 和 reflect.Type
268 0
|
存储 Java 数据库连接
JDBC中MetaData对象使用与详解
JDBC中MetaData对象使用与详解
207 0
|
API
详解Reflect:Reflect和Object的异同,Reflect的一些内置方法以及方法注意点
详解Reflect:Reflect和Object的异同,Reflect的一些内置方法以及方法注意点
107 0
|
Kubernetes 容器
no matches for kind “Deployment“ in version “extensions/v1beta1“
no matches for kind “Deployment“ in version “extensions/v1beta1“
|
自然语言处理 Java 编译器
Go REFLECT Library | 01 - 反射的类型 Type
Go REFLECT Library | 01 - 反射的类型 Type
Go REFLECT Library | 01 - 反射的类型 Type
Go REFLECT Library | 06 - reflect.Type 和 reflect.Value 应用
Go REFLECT Library | 06 - reflect.Type 和 reflect.Value 应用