Reflection Metadata

홍범선·2023년 10월 31일
0

타입스크립트

목록 보기
29/34

reflection metadata

/**
 * Reflection Metadata
 */

import 'reflect-metadata';

const iu = {
  name: '아이유',
  age: 32,
  nationality : 'korean',
}

console.log(iu);

/**
 * 파라미터의 정의
 * 
 * 1) 메타데이터의 키
 * 2) 메타데이터 키에 저장할 값
 * 3) 메타데이터를 저장할 객체
 * 4) 메타데이터를 저장할 객체의 프로퍼티
 * 
 * 4번은 필수가 아니다.
 * 
 * 메타데이터가 무엇인가? - 데이터에 대한 데이터
 */
Reflect.defineMetadata('test-meta', 123, iu); //test-meta는 실제 자바스크립트 코드 내에서는 보이지가 않는다. reflect라이브러리를 사용해서만 볼 수있다.

console.log(iu);
console.log(Reflect.getMetadata('test-meta', iu)); //123이라는 값을 test-mdata라는 키에다 저장을 했다. iu객체에다 저장을 했다.
//Iu라는 데이터에 관련된 데이터를 저장한 것이다.

Reflect.defineMetadata('test-meta', 456, iu);
console.log(Reflect.getMetadata('test-meta', iu)); // 456으로 바뀐다. 하나의 키에는 한개의 값만 입력할 수 있고 두번 정의를 하게 되면 가장 최근 정의한 값이 저장이 된다.

Reflect.defineMetadata('test-meta2', 789, iu);
console.log(Reflect.getMetadata('test-meta2', iu));  //오브젝트 형태로 저장이 된다.

Reflect.defineMetadata('test-meta2', {name: '코드팩토리'}, iu);
console.log(Reflect.getMetadata('test-meta2', iu)); // 객체도 저장이 된다.


/**
 * 프로퍼티에 저장하기
 */
Reflect.defineMetadata('object-meta', 999, iu, 'name'); //iu  객체에서 name프로퍼티에 저장하겠다.
console.log(Reflect.getMetadata('object-meta', iu, 'name'));  //iu의 name프로퍼티 안에 있는 object-meta 키의 value값을 출력하겠다.

Reflect.deleteMetadata('object-meta', iu, 'name'); //iu라는 객체안에 name 프로퍼티에 object meta가 전부 삭제된다.
console.log(Reflect.getMetadata('object-meta', iu, 'name')); //삭제해서 undefined

console.log(Reflect.hasMetadata('object-meta', iu, 'name')); //false가 나온다.
console.log(Reflect.getMetadataKeys(iu)); //iu에 메타데이터 키값들을 전부 가져온다.

Reflect.defineMetadata('object-meta', 999, iu, 'name')
console.log(Reflect.getMetadataKeys(iu, 'name')); //object-meta가져온다.

Reflect.defineMetadata('prototype-data', '프로토타입 메타예요!', Object.getPrototypeOf(iu));

console.log(Reflect.getMetadataKeys(iu)); //[ 'test-meta', 'test-meta2', 'prototype-data' ]
// prototype-data는 아이유의 프로토타입에다 저장했지만 다 나온다. 즉 on이 없을 때에는 프로토타입 전체를 검색해보면서 상위에 존재하는지까지 검색을 해본다.

console.log(Reflect.getOwnMetadataKeys(iu)); //[ 'test-meta', 'test-meta2' ] 실제 iu객체에 저장한 것만 나온다. iu객체 부모인 prototype에 정의한 prototype-data는 나오지 않는다.
profile
알고리즘 정리 블로그입니다.

0개의 댓글