0%

reflect-metadata原理

前言

最近看依赖注入控制反转,javascript的实现借助了inversifyjs,而inversifyjs又用到了reflect-medadata,简单的研究了下reflect-metadata内部结构,想看看它是怎么存储元数据的。

正文

简单看一个api

1
Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey);

它内部定义了一个weakmap,用于和target关联,创建这个weakmap的主要流程

1
2
3
4
5
6
7
8
9
10
11
12
13
Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey);

const weakmap = new WeakMap()

const metadata = new Map()

metadata.set(metadataKey, metadataValue)

const metadataMap = new Map()

metadataMap.set(propertyKey, metadata)

weakmap.set(target, metadataMap)

分为三层map,每一个target通过weakmap映射到一个metadataMap,metadataMap内部存储了target对象上所有键的元数据(metadata),metadata也是一个map,里面映射metadataKey => metadataValue,大致如此。