// define metadata on an object or propertyReflect.defineMetadata(metadataKey, metadataValue, target);
Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey);
// check for presence of a metadata key on the prototype chain of an object or propertylet result = Reflect.hasMetadata(metadataKey, target);
let result = Reflect.hasMetadata(metadataKey, target, propertyKey);
// check for presence of an own metadata key of an object or propertylet result = Reflect.hasOwnMetadata(metadataKey, target);
let result = Reflect.hasOwnMetadata(metadataKey, target, propertyKey);
// get metadata value of a metadata key on the prototype chain of an object or propertylet result = Reflect.getMetadata(metadataKey, target);
let result = Reflect.getMetadata(metadataKey, target, propertyKey);
// get metadata value of an own metadata key of an object or propertylet result = Reflect.getOwnMetadata(metadataKey, target);
let result = Reflect.getOwnMetadata(metadataKey, target, propertyKey);
// get all metadata keys on the prototype chain of an object or propertylet result = Reflect.getMetadataKeys(target);
let result = Reflect.getMetadataKeys(target, propertyKey);
// get all own metadata keys of an object or propertylet result = Reflect.getOwnMetadataKeys(target);
let result = Reflect.getOwnMetadataKeys(target, propertyKey);
// delete metadata from an object or propertylet result = Reflect.deleteMetadata(metadataKey, target);
let result = Reflect.deleteMetadata(metadataKey, target, propertyKey);
// apply metadata via a decorator to a constructor
@Reflect.metadata(metadataKey, metadataValue)
classC{
// apply metadata via a decorator to a method (property)
@Reflect.metadata(metadataKey, metadataValue)
method() {
}
}
// Design-time type annotationsfunctionType(type) { returnReflect.metadata("design:type", type); }
functionParamTypes(...types) { returnReflect.metadata("design:paramtypes", types); }
functionReturnType(type) { returnReflect.metadata("design:returntype", type); }
// Decorator application
@ParamTypes(String, Number)
classC{
constructor(text, i) {
}
@Type(String)
get name() { return"text"; }
@Type(Function)
@ParamTypes(Number, Number)
@ReturnType(Number)
add(x, y) {
return x + y;
}
}
// Metadata introspectionlet obj = new C("a", 1);
let paramTypes = Reflect.getMetadata("design:paramtypes", inst, "add"); // [Number, Number]
2Abstract Operations
2.1Operations on Objects
2.1.1GetOrCreateMetadataMap ( O, P, Create )
When the abstract operation GetOrCreateMetadataMap is called with Object O, property key P, and Boolean Create the following steps are taken:
3.1Ordinary Object Internal Methods and Internal Slots
All ordinary objects have an internal slot called [[Metadata]]. The value of this internal slot is either null or a Map object and is used for storing metadata for an object.
3.1.1[[HasMetadata]] ( MetadataKey, P )
When the [[HasMetadata]] internal method of O is called with ECMAScript language valueMetadataKey and property key P, the following steps are taken:
When the abstract operation OrdinaryHasMetadata is called with ECMAScript language valueMetadataKey, Object O, and property key P, the following steps are taken:
If parent is not null, Return ? parent.[[HasMetadata]](MetadataKey, P).
Return false.
3.1.2[[HasOwnMetadata]] ( MetadataKey, P )
When the [[HasOwnMetadata]] internal method of O is called with ECMAScript language valueMetadataKey and property key P, the following steps are taken:
3.1.2.1OrdinaryHasOwnMetadata ( MetadataKey, O, P )
When the abstract operation OrdinaryHasOwnMetadata is called with ECMAScript language valueMetadataKey, Object O, and property key P, the following steps are taken:
When the abstract operation OrdinaryGetMetadata is called with ECMAScript language valueMetadataKey, Object O, and property key P, the following steps are taken:
When the [[GetOwnMetadata]] internal method of O is called with ECMAScript language valueMetadataKey and property key P, the following steps are taken:
3.1.4.1OrdinaryGetOwnMetadata ( MetadataKey, O, P )
When the abstract operation OrdinaryGetOwnMetadata is called with ECMAScript language valueMetadataKey, Object O, and property key P, the following steps are taken: