λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ‘¨‍πŸ’» web.dev/js.ts

[JavaScript] Object.defineProperty 에 λŒ€ν•΄μ„œ

by HandHand 2022. 3. 6.

Object.defineProperty 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž

πŸ“Œ Object.defineProperty?

Vue 2.x 라이브러리 μ†ŒμŠ€λ₯Ό 보닀보면 Object.definePrototype 으둜

객체에 μƒˆλ‘œμš΄ 속성을 ν• λ‹Ήν•˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

Object.defineProperty() 의 νŠΉμ§•

  • 객체의 속성을 μ„Έλ°€ν•˜κ²Œ μΆ”κ°€ν•˜κ±°λ‚˜ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 객체에 getter / setter λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • IE 9 버전뢀터 μ§€μ›ν•©λ‹ˆλ‹€. (λ”°λΌμ„œ Vue 2.x 도 이 뢀뢄에 μ œμ•½μ„ λ°›μŠ΅λ‹ˆλ‹€.)

 

πŸ“Œ 속성 μ„œμˆ μž (Property descriptor)

속성 μ„œμˆ μžλŠ” 데이터 μ„œμˆ μž 와 μ ‘κ·Όμž μ„œμˆ μž 둜 κ΅¬μ„±λ©λ‹ˆλ‹€.

Object.defineProperty 에 μ‚¬μš©ν•˜λŠ” μ„œμˆ μžλŠ” 두 μœ ν˜•μ€‘ ν•˜λ‚˜μ—¬μ•Όν•©λ‹ˆλ‹€.

이 λ‘˜μ€ λͺ¨λ‘ 객체둜 λ‹€μŒμ˜ 선택적 ν‚€λ₯Ό κ³΅μœ ν•©λ‹ˆλ‹€.

 

configurable : 객체 μ†μ„±μ˜ κ°’ λ³€κ²½ 및 μ‚­μ œ κ°€λŠ₯ μ—¬λΆ€
enumerable : 객체 속성 μ—΄κ±° μ‹œ λ…ΈμΆœ μ—¬λΆ€

 

데이터 μ„œμˆ μž

데이터 μ„œμˆ μžλŠ” 값을 κ°€μ§€λŠ” 속성을 μ •μ˜ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

μ΄λŠ” λ‹€μŒ ν‚€λ₯Ό μ„ νƒμ μœΌλ‘œ ν¬ν•¨ν•©λ‹ˆλ‹€.

 

value : 속성에 μ—°κ΄€λœ κ°’
writable : ν• λ‹Ή μ—°μ‚°μž (=) 둜 값을 λ°”κΏ€ 수 μžˆλŠ”μ§€ μ—¬λΆ€

 

μ ‘κ·Όμž μ„œμˆ μž

μ ‘κ·Όμž μ„œμˆ μžλŠ” getter, setter λ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

μ΄λŠ” λ‹€μŒ ν‚€λ₯Ό μ„ νƒμ μœΌλ‘œ ν¬ν•¨ν•©λ‹ˆλ‹€.

 

get : μ ‘κ·Όμžλ‘œ μ‚¬μš©ν•  ν•¨μˆ˜ (속성에 μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•œ 객체λ₯Ό this 둜 μ§€μ •ν•΄μ„œ λ§€κ°œλ³€μˆ˜ 없이 호좜)
set : μ„€μ •μžλ‘œ μ‚¬μš©ν•  ν•¨μˆ˜ (속성에 값을 ν• λ‹Ήν•  λ•Œ μ‚¬μš©ν•œ 객체λ₯Ό this 둜 μ§€μ •ν•΄μ„œ ν•œ 개의 λ§€κ°œλ³€μˆ˜μ™€ ν•¨κ»˜ 호좜)

 

πŸ“Œ 속성 생성 μ˜ˆμ‹œ

1️⃣ writable

ν•΄λ‹Ή 속성이 false 라면 κ°’μ˜ 갱신이 λΆˆκ°€μ°¨

λ§Œμ•½ 값을 κ°±μ‹ ν•˜λ €κ³  ν•˜λ©΄ λ¬΄μ‹œλ©λ‹ˆλ‹€.

 

const ob = {};

Object.defineProperty(ob, "a", {
  value: 30,
  writable: false,
});

console.log(ob.a); // 30
ob.a = 50;
console.log(ob.a); // 30

2️⃣ enumerable

enumerable 은 Object.assign κ³Ό μ „κ°œ μ—°μ‚°μžκ°€ ν•΄λ‹Ή 속성을 μ—΄κ±°ν•  수 μžˆλŠ”μ§€ κ²°μ •ν•©λ‹ˆλ‹€.

λ˜ν•œ Symbol 이 μ•„λ‹Œ 속성듀에 λŒ€ν•΄μ„œ for in κ³Ό Object.keys μ—μ„œ μΆ”μΆœ κ°€λŠ₯ν•œμ§€λ„ κ²°μ •ν•©λ‹ˆλ‹€.

 

const ob = {};

Object.defineProperty(ob, "a", {
  value: 30,
  enumerable: false,
});
Object.defineProperty(ob, "b", {
  value: 50,
  enumerable: true,
});

console.log(Object.keys(ob)); // ['b']

3️⃣ configurable

ν•΄λ‹Ή νŠΉμ„±μ„ μ‚¬μš©ν•˜λ©΄ κ°μ²΄μ—μ„œ ν•΄λ‹Ή 속성을 μ‚­μ œ ν˜Ήμ€ κ·Έ μ†μ„±μ˜ μ§€μ •μžλ₯Ό λ³€κ²½ν•  수 μžˆλŠ”μ§€ κ²°μ •ν•©λ‹ˆλ‹€.

 

const ob = {};

Object.defineProperty(ob, "a", {
  value: 30,
  configurable: false,
});

delete ob.a;
console.log(ob.a); // 30

4️⃣ getter / setter

객체의 속성에 getter / setter λ₯Ό μ§€μ •ν•˜λ©΄ 각각 μ†μ„±μ—μ„œ

값을 읽을 λ•Œμ™€ μ“Έλ•Œ ν˜ΈμΆœμ‹œν‚¬ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

function AboutMe() {
  Object.defineProperty(this, "name", {
    get() {
      console.log("get name");
      return this.stored_name;
    },
    set(name) {
      console.log("set name");
      this.stored_name = name;
    },
  });
}

const info = new AboutMe();
info.name = "HandHand";
console.log(info.name);

/** λ‹€μŒ μ‹€ν–‰ κ²°κ³Όλ₯Ό κ°€μ§‘λ‹ˆλ‹€ */
set name
get name
HandHand

 

πŸ“Œ μ°Έκ³  자료

Object.defineProperty() - JavaScript | MDN

λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€