본문으둜 κ±΄λ„ˆλ›°κΈ°

λ°μ½”λ ˆμ΄ν„°(Decorator)

아직 JS의 정식 κΈ°λŠ₯이 μ•„λ‹ˆλ‹€. ECMA TC39의 ν‘œμ€€ν™” 절차λ₯Ό μ§„ν–‰ν•˜κ³  μžˆλ‹€.

Babel을 μ‚¬μš©ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

  • μƒˆ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜μ—¬ μ „λ‹¬λœ ν•¨μˆ˜ λ˜λŠ” λ©”μ„œλ“œμ˜ λ™μž‘μ„ μˆ˜μ •ν•˜λŠ” ν•¨μˆ˜

  • ν•¨μˆ˜λ₯Ό 일급 μ‹œλ―ΌμœΌλ‘œμ„œμ˜ κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” λͺ¨λ“  μ–Έμ–΄λŠ” λ°μ½”λ ˆμ΄ν„°λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.

  • 파이썬 예제

    파이썬의 λ°μ½”λ ˆμ΄ν„°κ°€ JS의 λ°μ½”λ ˆμ΄ν„° μž‘λ™ 방식보닀 λ‹¨μˆœν•˜μ—¬ μ„€λͺ…ν•˜κΈ° μ’‹λ‹€.

    def cashify(fn):  def wrap():    print("$$$$")    fn()    print("$$$$")  return wrap
    @cashifydef sayHello():  print("hello!")
    sayHello()
    # $$$$
    # hello!
    # $$$$

속성 μ„€λͺ…μž#

  • JS κ°μ²΄λŠ” ν”„λ‘œνΌν‹°κ°€ 있고, 각 ν”„λ‘œνΌν‹°λŠ” κ°’ 뿐만 μ•„λ‹ˆλΌ μˆ¨κ²¨μ§„ 정보듀을 κ°–λŠ”λ‹€ .

    • Object.getOwnPropertyDescriptor / Object.getOwnPropertyDescriptors λ₯Ό μ‚¬μš©ν•΄ μ•Œ 수 μžˆλ‹€.
    const oatmeal = {    viscosity: 20,    flavor: 'Brown Sugar Cinnamon',};
    console.log(Object.getOwnPropertyDescriptor(oatmeal, 'viscosity'));
    /*{  value: 20,  writable: true,  enumerable: true,  configurable: true,}*/
  • 객체의 μ ‘κ·Όμž ν”„λ‘œνΌν‹°λŠ” value와 writable이 μ—†λŠ” λŒ€μ‹ μ— getκ³Ό setμ΄λΌλŠ” ν•¨μˆ˜κ°€ μžˆλ‹€.

λ°μ½”λ ˆμ΄ν„° μž‘μ„±λ²•#

  • JS λ°μ½”λ ˆμ΄ν„° ν•¨μˆ˜μ—λŠ” μ„Έ 가지 μΈμžκ°€μ „λ‹¬λœλ‹€.
    1. target : ν˜„μž¬ μΈμŠ€ν„΄μŠ€ 객체의 클래슀
    2. key : λ°μ½”λ ˆμ΄ν„°λ₯Ό μ μš©ν•  속성 이름(λ¬Έμžμ—΄ )
    3. descriptor : ν•΄λ‹Ή μ†μ„±μ˜ μ„€λͺ…μž 객체 - 객체의 λ©”μ„œλ“œλ‚˜μ†μ„±μ„ κΎΈλ―Έλ €λ©΄μƒˆλ‘œμš΄ 속성 μ„€λͺ…μžλ₯Όλ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. - 속성을 μ½κΈ°μ „μš©μœΌλ‘œ λ§Œλ“œλŠ” λ°μ½”λ ˆμ΄ν„°
function readOnly(target, key, descriptor) {    return {...descriptor, writable: false};}
class Oatmeal extends Porridge {    @readOnly viscosity = 20;
    constructor(flavor) {        super();        this.flavor = flavor;    }}

TypeScript#

  • tsconfig.jsonμ—μ„œexperimentalDecorators 컴파일러 μ˜΅μ…˜μ„ ν™œμ„±ν™”ν•΄μ•Ό ν•œλ‹€.

λ°μ½”λ ˆμ΄ν„° ν•©μ„±#

참고자료#