WeakMap

박민형·2022년 5월 27일
0
post-thumbnail

📌 WeakMap

🔎 개념

👉 key/value 구조로 데이터 저장
👉 key는 객체여야 하지만 값으로는 아무 값이나 사용할 수 있음(Map은 key 값도 아무거나 사용 가능)
👉 Array를 확장한 것이 set, WeakSet 이라면 Object를 확장한 것은 Map, WeakMap

let wm = new WeakMap();
let myFun = function () {};
let park = {};

// myFun을 key이고 value가 0인 데이터를 저장
wm.set(myFun, 0);
wm.set(park, 20);

// WeakMap {ƒ => 0, {…} => 20}
console.log(wm);

let count = 0;
for (let i = 0; i < 10; i++) {
  // wm에서 myFunc key의 value을 get
  count = wm.get(myFun);
  count++;
  // wm에서 myFunc key의 value를 set
  wm.set(myFun, count);
}
// 10
console.log(wm.get(myFun));

myFun = null;
// false => 더 이상 WeakMap에서 myFun를 관리하지 않겠다.
console.log(wm.has(myFun));

📌 WeakMap 활용: private 변수를 클래스에서 만들어서 사용할 때

👉 클래스의 인스턴스가 클래스의 변수에 접근하지 못하게 하기 위한 방법
👉 private한 변수를 클래스에서 만들어서 사용할 때 외부에 전역 공간을 옮길 수가 있는데 그때 WeakMap을 이용해서 보관하면 굉장히 효율적

const wm = new WeakMap();

function Area(height, width) {
  wm.set(this, { height, width });
  	// 0: {Area => Object}
	// key: Area {}
	// value: {height: 10, width: 20}
  console.log(wm);
}

Area.prototype.getArea = function () {
  const { height, width } = wm.get(this);
  return height * width;
};

let myArea = new Area(10, 20);
// 200
console.log(myArea.getArea());
// undefined(클래스 내부 변수에 접근할 수 없음!)
console.log(myArea.heigth);

0개의 댓글